python多進程進程間通信疑問,求大神指教?(主進程獲取不到子進程變數)
01-29
主進程獲取不到子進程變數:
嘗試過的方法:管道只能2個進程,所以放棄了隊列queue;array模塊(內存共享)不知道是用法有問題還是怎麼的,一直取不到子進程信息;
簡單例子:主進程fork方式並發孫子進程執行任務;獲取到所有子進程的pid;結果:獲取失敗下面是代碼:#!/usr/bin/python#conding=utf-8
import Queue,osdef dofork(): p=os.fork() if p == 0: q.put(os.getpid()) p1=os.fork() if p1 == 0: q.put(os.getpid())print "grandonchlid _exit %s" % os.getpid()
os._exit(2) else: print "chlid _exit %s" % p1 os._exit(2) else: print "new chlied _exit %s" % pdef main(): print "q len %s" % q.qsize() if q.qsize() != 0:for i in range(1,q.qsize()):
print q.get(i) continueif __name__ == "__main__": q=Queue.Queue() dofork() dofork() print "main pid %s" % os.getpid() main()
因為Queue使用的本地內存。fork後內存是Copy On Write的,對本地內存的修改會導致內存在子進程中被複制一份。而父進程無法讀取子進程的本地內存的。
你應該使用multiprocessing.Queue 而不是Queue.Queue.
另外,Python多進程編程最好使用multiprocessing庫。fork函數除了罕見的情況,不推薦直接使用。用zeromq庫,直接給你傳事件進回調函數,你這樣自己輪詢性能差還容易阻塞事件循環。
用回調函數來傳遞啊。
多進程內存共享要使用multipleprocessing模塊下的類
推薦閱讀:
※Python程序中不同的重啟機制
※使用vs code進行Python編程,如何進行input輸入?
※為什麼Sublime Text不支持Python交互?
※Python中一個創建樹結構的方法。
※Python 類組合(composition)和聚合(aggregation)