2016-08-30 65 views
1

我想有主要的Python進程來創建一個子進程,連續更新一個對象(節點)。一個對象需要可以從主進程和子進程訪問。一旦我嘗試從它中檢索Node對象時,將我的Node對象的實例添加到manager.dict()的實例中,主進程就會被阻止。 下面是一個簡單的代碼python multiprocessing manager.dict()阻止

test.py

from multiprocessing import Process, Manager 
import time 


class Node(object): 
    def __init__(self, host): 
     self.host = host 
     self.refreshed = 0 

    def refresh(self): 
     self.refreshed = int(time.time()) 

    def __repr__(self): 
     return 'Node host:%s' % (self.host,) 

man = Manager() 
d = man.dict() 


def worker(d): 
    while True: 
     node = d['n1'] 
     node.refresh() 
     d['n1'] = node 
     time.sleep(3) 

proc = Process(target=worker, args=(d,)) 

run.py

import test 

test.d['n1'] = test.Node('localhost') 
test.proc.start() 

如果我放棄在這裏解釋器做test.d.items()它會阻止。

更新 如果我改變了代碼而不是Node實例只是使用原始值,例如,增加一個int,它工作正常。

更新 如果我從run.py移動代碼的test.py底部,所以一切都在相同的範圍內,那麼它工作正常。

回答

2

儘量把後面的代碼

if __name__ == "main":

例如:

if __name__ == "__main__": 
    man = Manager() 
    d = man.dict() 
    proc = Process(target=worker, args=(d,)) 
相關問題