鱼C论坛

 找回密码
 立即注册
查看: 1712|回复: 4

关于Pipe()的一个疑问

[复制链接]
发表于 2020-1-14 18:46:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
主进程中建了一个管子,每个子进程中也有使用管子的返回值,按理说,每个进程中的管子的两个口都是分配了独立的内存空间的,为什么进程间还能通过管子通讯呢?每个管子的两个口,通过id的输出 显示的很清楚了,不一样啊。

  1. from multiprocessing import Process,Pipe

  2. def demo1(pipe):
  3.     left,right=pipe
  4.     print('demo1,left.fileno is %d,right.fileno is %d'%(left.fileno(),right.fileno()))
  5.     print('demo1,id(left) is %d,id(right) is %d'%(id(left),id(right)))
  6.     right.close()  
  7.     while True:
  8.         try:
  9.             s = left.recv()
  10.             print(s)
  11.         except:
  12.             left.close()
  13.             print('pipe close')
  14.             break

  15. def demo2(pipe):
  16.     left,right=pipe
  17.     print('demo2,left.fileno is %d,right.fileno is %d'%(left.fileno(),right.fileno()))
  18.     print('demo2,id(left) is %d,id(right) is %d'%(id(left),id(right)))
  19.     left.close()  
  20.     for i in range(5):
  21.         try:
  22.             right.send(i)
  23.         except:
  24.             print('pipe close')
  25.             break
  26.     right.close()


  27. if __name__ == '__main__':
  28.     pipe=Pipe()
  29.     left, right = pipe
  30.     print('__main__,left.fileno is %d,right.fileno is %d'%(left.fileno(),right.fileno()))
  31.     print('__main__,id(left) is %d,id(right) is %d'%(id(left),id(right)))
  32.     p1=Process(target=demo1,args=(pipe,))
  33.     p2=Process(target=demo2,args=(pipe,))
  34.     p1.start()
  35.     p2.start()
  36.     left.close()
  37.     right.close()
复制代码


2020-01-14_184327.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-1-14 20:55:46 | 显示全部楼层
本帖最后由 Stubborn 于 2020-1-14 21:05 编辑

从头到尾,你的pipe=Pipe()  都是用的一个,你还不如这样写
  1. if __name__ == '__main__':
  2.     pipe=Pipe()
  3.     p1=Process(target=demo1,args=(pipe,))
  4.     p2=Process(target=demo2,args=(pipe,))
  5.     p1.start()
  6.     p2.start()
复制代码


两个管道
  1.     left, right = Pipe(), Pipe()
  2.     print('__main__,id(left) is %d,id(right) is %d'%(id(left),id(right)))
复制代码



进程不是很熟,不过进程之前通讯,也可以同队队列来处理,同理这个Pip管道,应该也是类似队列,你这里是创建了一个‘队列’,多个标识符引用而已
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-14 21:25:33 | 显示全部楼层
Stubborn 发表于 2020-1-14 20:55
从头到尾,你的pipe=Pipe()  都是用的一个,你还不如这样写

pipe = Pipe() 在主进程中是这样,但是创建了子进程之后,子进程会复制父进程和数据结构,还会创建独立的内存空间,所以你在进程看到的对象其实新的了,我觉得奇怪的地方就在这,为何不是一个管道,但是还可以保持通讯?

left, right = Pipe(), Pipe()
你这样写的话,不对吧,改变了这个赋值的初衷了,left,right的类型也变了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-14 21:35:16 | 显示全部楼层
介左来了 发表于 2020-1-14 21:25
pipe = Pipe() 在主进程中是这样,但是创建了子进程之后,子进程会复制父进程和数据结构,还会创建独立的 ...

直接用队列把  简单  进程没有仔细学,帮不到你。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-14 21:49:18 | 显示全部楼层
Stubborn 发表于 2020-1-14 21:35
直接用队列把  简单  进程没有仔细学,帮不到你。

用队列 是比较清晰,我再考虑一下这个问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-21 20:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表