为什么我不能在Windows上的multiprocessing.Connection对象上轮询()?

时间:2018-08-03 19:27:30

标签: python multiprocessing

使用multiprocessing.Pipe创建两个multiprocessing.Connection对象,为此我通过Conection.fileno()读取文件描述符/句柄,然后将其作为命令行参数传递给另一个进程。我相信这类似于多处理产生子进程的方式。

在子进程中,我通过从命令行参数读取句柄来创建multiprocessing.Connection对象,然后在两个进程之间进行通信。

这在我的Mac上运行良好,但是由于某些原因在Windows上调用Connection.poll方法会导致以下错误:

  

IOError:[Errno 10038]尝试对非套接字的东西进行操作

造成差异的原因是什么?为什么在poll的文档中没有提及?

一个简单的代码示例可能类似于:

在father.py中:

c1, c2 = multiprocessing.Pipe()
subprocess.Popen(['child.py', str(c1.fileno())])

在child.py中:

c1 = multiprocessing.Connection(int(sys.argv[1]))
c1.poll(1)

有关其他详细信息,我的this问答描述了我要实现的目标以及最终的实现方式。

1 个答案:

答案 0 :(得分:0)

事实证明,该问题并非特定于poll,而是所有Connection方法都与底层句柄(recvsend)交互。

因为multiprocessing.Pipe在Windows中创建了一个命名管道,并结合了python2中管道句柄继承的工作方式(曾经被确定为根本原因显示为discussed {{ 3}} pretty)传递句柄似乎很困难,即使不是不可能。

再次浏览多处理程序的文档,我注意到heavily对我来说很有效,并将Listener.address属性中的内容传递给Client的构造函数。