我正在写一个纸牌模拟器来收集统计数据,我想并行化以同时在所有内核上运行游戏。为此,我编写了multiprocessing.Process的子目录,并累积了所有线程的结果,我尝试使用所有线程在锁定部分中写入的类变量。这是我的代码:
class Parallel(multiprocessing.Process):
sum = 0
res = []
lock = multiprocessing.Lock()
def __init__(self,N,id):
super(Parallell,self).__init__()
self.sum = 0
self.N = N
self.res = []
self.id = id
def run(self):
# Play N games to generate local sum and result list
self.writeFinalData()
def writeFinalData(self):
Parallel.lock.acquire()
Parallel.sum += self.sum
Parallel.res = Parallel.res + self.res
Parallel.lock.release()
# Following simply prints sum and res for this instance,it is not
# accumulated/concatenated with results from other threads
print(Parallel.sum)
print(Parallel.res)
在我看来,这很好,但是运行该程序后,似乎每个线程完成后都会覆盖类变量中已经存在的内容。如果以前有一个线程在其中写一个数字到 sum 和一个列表到 res ,那么当新线程锁定并写入时,这些都将消失。
我无法理解这种行为。在我看来,似乎每个线程都应该追加和添加,而不是覆盖,但是显然并非如此。任何帮助将不胜感激。