2017-10-18 58 views
2

我试图运行下面的代码多:多重跟不上结果

import multiprocessing 

class test(multiprocessing.Process): 
    def __init__(self, name): 
     multiprocessing.Process.__init__(self) 
     self.name = name 
     self.finished = False 

    def run(self): 
     print("executed") 
     self.finished = True 

test_list = [] 
test_list.append(test('first')) 
test_list.append(test('second')) 

for t in test_list: 
    t.start() 

for t in test_list: 
    t.join() 

for t in test_list: 
    print(t.finished) 

,并得到结果:

executed 
executed 
False 
False 

False输出看起来很奇怪。我已经设置了属性finished是在方法runTrue,且输出executed表明run方法已被执行。而且,如果我的方法runself.finished=True后添加一行print(self.finished)立即输出将True。为什么在多处理完成后类属性finished发生了变化?

谢谢!

+0

t.finish在其他进程中更新,而不是在主进程中更新。请参阅:https://docs.python.org/3/library/multiprocessing.html#sharing-state-between-processes – gammazero

回答

0

这将允许您共享进程之间的完成值。它使用multiprocessing.Value使用共享内存创建共享对象。

from multiprocessing import Process, Value 

class test(Process): 
    def __init__(self, name, fin): 
     Process.__init__(self) 
     self.name = name 
     self.finished = fin 

    def run(self): 
     print("executed") 
     self.finished.value = True 

test_list = [] 
test_list.append(test('first', Value('b', False))) 
test_list.append(test('second', Value('b', False))) 

for t in test_list: 
    t.start() 

for t in test_list: 
    t.join() 

for t in test_list: 
    print(bool(t.finished.value)) 
+0

This Works,thanks! – Craig

1

self.finished = True执行另一个进程,并仅改变在这一过程中的变量,但是要打印从主过程中的价值。你需要共享的变量。

from multiprocessing import Process,Value 
from ctypes import c_bool 

class test(Process): 
    def __init__(self,name): 
     super().__init__() 
     self.name = name 
     self._finished = Value(c_bool,False) 

    def run(self): 
     print(self.name,'executed') 
     self._finished.value = True 

    @property 
    def finished(self): 
     return self._finished.value 

if __name__ == '__main__': 
    test_list = [test('first'), 
       test('second')] 

    for t in test_list: 
     t.start() 

    for t in test_list: 
     t.join() 

    for t in test_list: 
     print(t.finished)