multiprocessing 进程池 数据共享

注:嵌套列表必须也声明为 multiprocessing.Manager().list() ,否则针对嵌套列表的操作无效,因此,建议先构建列表,再创建共享列表进行初始化:

import multiprocessing


def test1(mlist):
    mlist.append(['111', '222', '333'])
    mlist.append(['444', '555', '666'])
    mlist.append(['777', '888', '999'])


# 如果传入的是共享数据,此函数无效
def test2(mlist):
    mlist[1].append('aaa')
    mlist[2].append('bbb')


def test_process(m_shared_list, m_lock):
    m_info = m_shared_list.pop()

    m_pid = multiprocessing.current_process().pid
    m_pname = multiprocessing.current_process().name
    m_lock.acquire()
    print('start', m_pid, m_pname, m_shared_list)
    m_lock.release()
    time.sleep(random.random())

    m_shared_list.append(m_info)
    m_lock.acquire()
    print('done', m_pid, m_pname, m_shared_list)
    m_lock.release()

    return 0


# 使用进程池必须定义main函数
if __name__ == "__main__":
    test_list = []
    test1(test_list)
    test2(test_list)
    
    shared_list = multiprocessing.Manager().list(test_list)
    # 使用lock保障控制台输出的完整性
    lock = multiprocessing.Manager().Lock()
    pool = multiprocessing.Pool(3)
    for i in range(10):
        pool.apply_async(test_process, (shared_list, lock))
    pool.close()
    pool.join()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用 `multiprocessing` 模块实现的基础案例,包括了 Process 类、进程间通信、进程进程同步和共享内存等功能: ```python import multiprocessing # 定义一个函数,用于向队列中写入数据 def write_data(queue): for i in range(10): queue.put(i) print("write_data finished") # 定义一个函数,用于从队列中读取数据 def read_data(queue): while True: data = queue.get() if data is None: break print("read_data received:", data) print("read_data finished") # 定义一个函数,用于计算阶乘 def factorial(n, result_queue): result = 1 for i in range(1, n+1): result *= i result_queue.put(result) # 定义一个函数,用于加锁 def increment(lock, shared_value): for i in range(10000): lock.acquire() shared_value.value += 1 lock.release() # 定义一个函数,用于创建进程 def create_pool(): with multiprocessing.Pool(processes=4) as pool: results = pool.map_async(factorial, [5, 6, 7, 8]) pool.close() pool.join() print(results.get()) if __name__ == '__main__': # 创建一个队列,用于进程间通信 queue = multiprocessing.Queue() # 创建两个进程,一个向队列中写入数据,一个从队列中读取数据 p1 = multiprocessing.Process(target=write_data, args=(queue,)) p2 = multiprocessing.Process(target=read_data, args=(queue,)) # 启动进程 p1.start() p2.start() # 等待进程结束 p1.join() queue.put(None) p2.join() # 创建一个共享内存,用于多个进程之间共享数据 shared_value = multiprocessing.Value('i', 0) lock = multiprocessing.Lock() # 创建多个进程,用于对共享内存进行加锁操作 processes = [multiprocessing.Process(target=increment, args=(lock, shared_value)) for _ in range(4)] # 启动进程 for process in processes: process.start() # 等待进程结束 for process in processes: process.join() print("shared_value:", shared_value.value) # 创建一个进程,用于计算阶乘 create_pool() ``` 这个案例中,我们首先创建了一个队列,用于实现进程间通信,然后创建了两个进程,一个向队列中写入数据,一个从队列中读取数据。接着,我们创建了一个共享内存,用于多个进程之间共享数据,并创建了多个进程,用于对共享内存进行加锁操作。最后,我们创建了一个进程,用于计算阶乘。这个案例中涉及到了 `Process` 类、队列、共享内存、进程进程同步等多个 `multiprocessing` 模块的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值