如何在没有队列的情况下更改多处理中的类值?

时间:2016-03-23 12:05:19

标签: python global-variables multiprocessing

我可以在新流程中更改值var1吗?

class A: 
    var1 = 0 

method2(): 
    var1 += 1 

method1(): 
    p = multiprocessing.Process(method2) 
    p.start() 
    p.join() 
    print(var1)

调用method1()。 var1没有改变。

A().method1()
>>> 0

顺便说一句,我无法使用Queues

1 个答案:

答案 0 :(得分:2)

由于python的GIL,多处理只能用于完全独立的任务,而不能使用共享内存。因此,当您创建流程p时,它会复制A实例的值,并更改此复制实例中var1的值,而不会修改原始实例。 但是你仍然可以通过使用多处理共享数组/值来实现它:

来自https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes

from multiprocessing import Value

var1 = Value('d', 0.0)

您需要确保不同的进程不会同时访问同一个变量,并使用Lock。 Hopefuly,multiprocessing模块中可用的所有共享变量都与Lock配对。

要访问锁定:

var1.acquire() # get the lock
# do stuff
var1.release() # don't forget to release it

我希望这会有所帮助。