gpt4 book ai didi

python multiprocessing.Process.Manager 没有产生一致的结果?

转载 作者:太空宇宙 更新时间:2023-11-04 10:52:06 24 4
gpt4 key购买 nike

我编写了以下代码来说明我遇到的问题。我正在尝试使用 Process.Manager.list() 来跟踪列表并增加该列表的随机索引。

每次产生 100 个进程,每个进程将列表的随机索引递增 1。因此,人们会期望结果列表的 SUM 每次都相同,对吗?我得到 203 到 205 之间的值。

from multiprocessing import Process, Manager
import random

class MyProc(Process):
def __init__(self, A):
Process.__init__(self)
self.A = A

def run(self):
i = random.randint(0, len(self.A)-1)
self.A[i] = self.A[i] + 1

if __name__ == '__main__':
procs = []
M = Manager()
a = M.list(range(15))
print('A: {0}'.format(a))
print('sum(A) = {0}'.format(sum(a)))

for i in range(100):
procs.append(MyProc(a))

map(lambda x: x.start(), procs)
map(lambda x: x.join(), procs)
print('A: {0}'.format(a))
print('sum(A) = {0}'.format(sum(a)))

最佳答案

正如 millimoose 指出的那样,这里的问题是 self.A[i] = self.A[i] + 1 中出现的竞争条件。当 self.A[i] + 1 被计算出来时,self.A[i] 可能已经被另一个进程改变了。

您的问题的一个可能解决方案是将索引传回父级,然后由父级执行加法。

from multiprocessing import Process, Manager
import random

class MyProc(Process):
def __init__(self, B, length):
Process.__init__(self)
self.B = B
self.length = length

def run(self):
i = random.randint(0, self.length-1)
self.B.append(i)

if __name__ == '__main__':
procs = []
M = Manager()
a = range(15)
b = M.list()
print('A: {0}'.format(a))
print('sum(A) = {0}'.format(sum(a)))

for i in range(100):
procs.append(MyProc(b, len(a)))

map(lambda x: x.start(), procs)
map(lambda x: x.join(), procs)

for i in b:
a[i] = a[i] + 1

print('A: {0}'.format(a))
print('sum(A) = {0}'.format(sum(a)))

向数组追加一个元素只是一个操作,因此避免了竞争条件。

关于python multiprocessing.Process.Manager 没有产生一致的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13168380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com