python管道_python 管道,进程间的数据共享

一. 管道

管道传输数据是不安全的,队列是安全的

导入管道 : from multiprocessing import Pipe

创建管道 : Pipe( duplex) 在进程之间创建一条管道,并返回元组( conn1,conn2),其中conn1,conn2表示管道两端的连接对象. 管道的创建必须在Process对象之前. ( duplex : 默认管道是全双工的,如果将duplex设成False,conn1只能用于接收,conn2只能用于发送)

接收方法 : conn1.recv() : 接收conn2.send(obj)发送的对象. 如果没有消息可接收,recv方法会一直阻塞. 如果连接的另外一段已经关闭,recv方法会抛出异常 : EOFError.

EOFError异常 : 管道中著名的异常,就是,父进程关闭了发送端,子进程还在等待继续接收数据.

conn1.send(obj) : 通过连接发送对象. obj是与序列化兼容的任意对象.

from multiprocessing importProcess,Pipedeffunc(con):

c1,c2=con

c1.close()#主进程用conn1发送数据,子进程要用对应的conn2接受,所以讲conn1关闭,不关闭程序会阻塞

while 1:try:#异常处理,出现异常退出

print(c2.recv())#将conn2接受的数据打印

except:#说明素有数据已经全部接受,进程会抛出异常

break

if __name__ == '__main__':

conn1,conn2= Pipe()#开启管道

p = Process(target=func, args=((conn1,conn2),))#将管道的两个返回值以元组形式传给子进程

p.start()

conn2.close()#用conn1发送数据,conn2不用,将其关闭

for i in range(10):

conn1.send(i)

conn1.close()#发送完数据后,将conn1关闭

如果单进程使用管道 : conn1发数据,conn2接受数据. conn2发数据,conn1接受数据.

如果多进程使用管道 : 父进程conn1发数据,子进程conn2接收数据.

父进程conn2发数据,子进程conn1接收数据.

父进程conn1接收数据,子进程conn2发数据.

父进程conn2接收数据,子进程conn1发数据.

二. 数据共享

进程间的数据是独立的,可以借助队列或者管道实现通信,二者都是基于消息传递的

虽然进程间的数据独立,但可以通过Manager实现数据共享,事实上Mansger的功能还有很多.

from multiprocessing importManager,Processdefmain(num):

num['w'] -= 1

print(num)#结果: 9

if __name__ == '__main__':

m=Manager()

num= m.dict({'w':10})# p = Process(target=main, args=(num,))

p.start()

p.join()print(num)#结果: 9

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中,进程通信(IPC)可以使用多种方法来实现,包括共享内存、消息队列、管道、套接字等。这些方法都可以用来在进程传递数据共享变量。 其中,共享内存是一种常用的方法,可以让多个进程共享同一块内存区域。在 Python 中,可以使用 multiprocessing 模块中的 Value 和 Array 类来实现进程共享变量。以下是一个示例: ```python import multiprocessing # 创建一个共享变量 shared_value = multiprocessing.Value('i', 0) # 定义一个函数,用于修改共享变量 def modify_shared_value(value): for i in range(10): with value.get_lock(): value.value += 1 print("Process {}: Shared value = {}".format(multiprocessing.current_process().name, value.value)) # 创建两个进程并启动它们 process1 = multiprocessing.Process(target=modify_shared_value, args=(shared_value,)) process2 = multiprocessing.Process(target=modify_shared_value, args=(shared_value,)) process1.start() process2.start() # 等待进程完成 process1.join() process2.join() # 输出最终的共享变量值 print("Final shared value = ", shared_value.value) ``` 在上面的示例中,我们首先使用 Value 类创建了一个整数类型的共享变量 shared_value,并初始化为 0。然后,我们定义了一个函数 modify_shared_value,该函数使用 with 语句获取共享变量的锁,并对其进行加 1 操作。最后,我们创建两个进程并启动它们,等待它们完成后输出最终的共享变量值。 需要注意的是,在共享变量的操作中,必须使用 with 语句获取共享变量的锁,以避免多个进程同时修改同一变量的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值