我有一个类变量声明为一个列表,我想从该类中声明的方法更新。但是,由于此方法处理大量数据,我使用多处理来调用它,因此我需要在更新之前锁定类变量。我无法弄清楚如何放置这样的锁并更新类变量。如果重要的话,我只是在任何时候创建该课程的一个对象。
答案 0 :(得分:1)
由于python的GIL,多处理只能用于完全独立的任务,而不能使用共享内存。 但是你仍然可以通过使用多处理共享数组/值来实现它:
来自https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes
from multiprocessing import Process, Value, Array
def f(n, a):
n.value = 3.1415927
for i in range(len(a)):
a[i] = -a[i]
if __name__ == '__main__':
num = Value('d', 0.0)
arr = Array('i', range(10))
p = Process(target=f, args=(num, arr))
p.start()
p.join()
print num.value
print arr[:]
现在正如您所问,您需要确保不同的进程不会同时访问同一个变量,并使用Lock
。 Hopefuly,multiprocessing
模块中可用的所有共享变量都与Lock配对。
要访问锁定:
num.acquire() # get the lock
# do stuff
num.release() # don't forget to release it
我希望这会有所帮助。
答案 1 :(得分:0)
如果您正在使用multiprocessing模块(而不是多线程,这是不同的),那么除非我弄错了,分叉的多个进程不共享内存并且每个进程都有自己的类副本。这意味着不需要锁定,但这也意味着类属性不会像您希望的那样共享。
多处理模块确实提供several ways以允许进程之间的通信,包括共享数组对象。也许这就是你要找的东西。
根据您正在做的事情,您可能还会考虑使用主工作模式,您可以在其中创建一个工作类,其中包含操作数据的方法,生成多个进程来运行此类,然后将数据集分派给工作人员使用多处理模块中的Queue类从主进程中获取。