我正在使用多处理模块,并使用池来启动多个工作人员。但是在父进程中打开的文件描述符在工作进程中关闭。我想让他们开放..!有没有什么办法可以传递文件描述符以便在父项和子项之间共享?如何在python中将文件描述符从父项传递给子项?
4
A
回答
2
我不知道在进程之间共享文件描述符的方法。 如果存在某种方式,它很可能是操作系统特定的。
我的猜测是你需要在另一个层面上共享数据。
7
可以使用_multiprocessing.sendfd/recvfd
函数来处理之间传输文件描述符:
示例代码:
# Before fork
child_pipe, parent_pipe = multiprocessing.Pipe(duplex = True)
# Main process
import _multiprocessing
# has socket_to_pass socket object which want to pass to the child
_multiprocessing.sendfd(parent_pipe.fileno(), socket_to_pass.fileno())
# Worker process
import _multiprocessing
import socket
import os
fd = _multiprocessing.recvfd(self.child_pipe.fileno())
# rebuild the socket object from fd
received_socket = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
# socket.fromfd() duplicates fd, so we can close the received one
os.close(fd)
# and now you can communicate using the received socket
received_socket.send("hello from the worker process\r\n")
不幸的是,这个模块未在Python库参考记录。
1
还有一个叫做multiprocess
的multiprocessing
的分支,它用dill
代替pickle
。 dill
可以腌制文件描述符,因此multiprocess
可以轻松地在进程之间传递它们。
>>> f = open('test.txt', 'w')
>>> _ = map(f.write, 'hello world')
>>> f.close()
>>> import multiprocess as mp
>>> p = mp.Pool()
>>> f = open('test.txt', 'r')
>>> p.apply(lambda x:x, f)
'hello world'
>>> f.read()
'hello world'
>>> f.close()
相关问题
- 1. 如何将控件从子项传递给父项
- 2. 如何在其他组件中将值从子项传递给父项?
- 3. 在Silverlight中将值从子项传递给父项
- 4. 将MouseWheel事件从子项传递给父项
- 5. 如何实现父子窗口并将值从子项传递给父项?
- 6. Actionscript 3将变量从父项传递给子项
- 7. 将对象从子项传递给父项
- 8. 将值从父项传递给子项(打开)窗口
- 9. VUE2将参数从子项传递给父项
- 10. 将listview子项事件传递给父项
- 11. Angular(4):将类对象从子项传递给父组件
- 12. 如何将值从父组件传递给路由中的子项:Angular 2
- 13. 在Python中,如何传递ctypes文件描述符来打开文件?
- 14. 如何将数据从父项传递给子项不止一次
- 15. Angular 2,如何将选项从父组件传递给子组件?
- 16. 在线性布局中将焦点从父项传递给子项
- 17. 将子选项卡内容中的“事件”传递给父TabActivity
- 18. 如何将输入值从子项传递给父组件反应
- 19. 将值从子窗口传递给父项
- 20. Django-python:如何将参数从子类传递给父类?
- 21. Angular 2将数据父项传递给子组件
- 22. Python - 如何将实例变量值传递给描述符参数?
- 23. 将弹出的值传递给父项
- 24. 如何将打开的文件描述符导出到execed子项
- 25. 将数据对象从父项传递到子项
- 26. Angular2新手将数据从父项传递到子项
- 27. 如何将数据关闭传递给$ mdDialog中的父项?
- 28. 将颜色框中的选项传递给父项
- 29. 如何从python中的下载url获取文件描述符?
- 30. 将数据父项传递给子节点
如前所述,您需要使用操作系统特有的功能。你有兴趣支持哪些平台? – Rakis 2010-06-07 13:38:07
我需要支持Windows和Linux,所以我不想使用任何操作系统特定的功能。在Linux中,文件句柄是默认共享的,windows也有一个选项可以在CreateProcess()过程中共享文件句柄......我不知道为什么多处理模块没有额外的选项来共享文件句柄。 – kumar 2010-06-07 13:40:34
由于Windows和Linux在传递文件句柄的语义上有所不同,因此您可能会*使用操作系统特定的功能。虽然没有问题,但是很容易区分'sys.platform'和只调用特定于操作系统的“为此操作系统工作”功能。我建议阅读多处理模块的代码,看看是否有简单的解决方法。 – Rakis 2010-06-07 13:54:29