標籤:

python多進程進程間通信疑問,求大神指教?(主進程獲取不到子進程變數)

主進程獲取不到子進程變數:

嘗試過的方法:

管道只能2個進程,所以放棄了

隊列queue;

array模塊(內存共享)

不知道是用法有問題還是怎麼的,一直取不到子進程信息;

簡單例子:

主進程fork方式並發孫子進程執行任務;獲取到所有子進程的pid;

結果:

獲取失敗

下面是代碼:

#!/usr/bin/python

#conding=utf-8

import Queue,os

def 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" % p

def main():

print "q len %s" % q.qsize()

if q.qsize() != 0:

for i in range(1,q.qsize()):

print q.get(i)

continue

if __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)

TAG:Python | 並發 |