python——多进程数据共享(一)

本文介绍了Python的multiprocessing模块实现多进程数据共享,包括数值型、数组型、字典和列表的共享方式,并提供了相应的代码示例和输出结果。

多进程数据共享:

多进程模块:multiprocessing

import multiprocessing

共享数据类型:
数值型, 数组型,字典和列表(dict, list)

数值型:    multiprocessing.Value()
数组型:    multiprocessing.Array()
dict, list: 
with multiprocessing.Manager() as MG:

数值型实例:

def test_value_process():
    num = multiprocessing.Value('d', 10.0)
    print(num.value) #注意获得具体的值,输出为num.value
    print(num)

    p = multiprocessing.Process(target= func, args=(num,)) 
### Python 多进程返回数据的方法 在Python中,由于进程之间默认不共享内存空间,因此要让多个子进程能够向父进程传递数据,通常会借助`multiprocessing.Queue`或`multiprocessing.Pipe`来完成这操作。下面通过具体实例展示如何利用队列(queue)机制实现多进程间的数据交换。 #### 使用Queue对象收集子进程的结果 ```python from multiprocessing import Process, Queue import time def worker(q, id): result = f"Worker {id} processed data" q.put((id, result)) time.sleep(1) if __name__ == '__main__': queue = Queue() processes = [] for i in range(5): # 创建五个工作进程 p = Process(target=worker, args=(queue,i,)) processes.append(p) p.start() for proc in processes: proc.join() while not queue.empty(): item = queue.get() print(f'Got message from process {item[0]}: {item[1]}') ``` 此段代码展示了创建若干个工作进程(worker),每个工作完成后都将自身的ID以及处理后的字符串放入公共的队列中[^2]。当所有的工作都结束后,在主线程里读取这些消息并打印出来。 对于更复杂的应用场景,比如需要同步控制或者双向通讯,则可以考虑采用管道(Pipe): #### 利用Pipe进行双工通信 ```python from multiprocessing import Pipe, Process def sender(conn, msg_list): for msg in msg_list: conn.send(msg) print(f'Sent the message: "{msg}"') conn.close() def receiver(conn): while True: try: msg = conn.recv() print(f'Received the message: "{msg}"') except EOFError: break parent_conn, child_conn = Pipe(duplex=True) p_send = Process(target=sender, args=(child_conn,['hello', 'world'])) p_recv = Process(target=receiver, args=(parent_conn,)) p_send.start(); p_recv.start(); p_send.join(); p_recv.join(); ``` 上述例子说明了两个方向上的信息流动——发送者将系列的消息送入连接的端;接收方则不断尝试从另侧获取新到达的信息直到遇到文件结束符为止。 为了进步提高效率和灵活性,还可以结合使用`Pool`类来进行批量任务分配,并自动回收已完成的任务所占用资源[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值