我正在使用多處理模塊,並使用池來啓動多個工作人員。但是在父進程中打開的文件描述符在工作進程中關閉。我想讓他們開放..!有沒有什麼辦法可以傳遞文件描述符以便在父項和子項之間共享?如何在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