2016-08-30 106 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,))