![](/img/trans.png)
[英]How can use the Process class of Pythons Multiprocessing library to run a function multiple times?
[英]Problems with Pythons Multiprocessing Process Class
我目前正在尝试进入 Python。 为了解释下面的代码,您可以看到一个程序来比较轮盘赌中的两种策略并运行多次。
“玩家” class 继承了这两种策略。 全局“ globalBal_1 ”和“ globalBal_2 ”变量计算每个策略的利润。
但是算法应该不是问题。 主要问题是,当我通过正常调用运行计算 function “运行”时,它会为我提供结果。 由于某种原因,多处理进程不会更改全局“ globalBal_1 ”和“ globalBal_2 ”变量,因此不会提供结果。 相反,正如我最初声明的那样,它们确实具有值“ 0 ”。 我在那里做错了什么? 我对多处理和 Python 本身还很陌生。
编辑:“ globalBal_1 ”和“ globalBal_2 ”的预期值大约是“ rounds ”的一半,所以在这种情况下应该是“ 500.000 ”(每个进程是 500.000/进程数量)。 但多处理运行的实际结果是“ 0 ”。
代码:
from numpy.random import randint
import time
from multiprocessing import Process
threads = 4
rounds = int(1000000 / threads)
globalBal_1 = 0
globalBal_2 = 0
class Player:
def __init__(self):
self.balance_1 = 0
self.balance_2 = 0
def strat_1(self, sequence):
counter = 0
for i in range(len(sequence) - 1):
if sequence[i]:
counter += 1
self.balance_1 += counter
def strat_2(self, sequence):
for i in range(len(sequence) - 1 - 1):
if sequence[i] == 1:
return
if sequence[len(sequence) - 1]:
self.balance_2 += 2 ** (len(sequence) - 0)
def getBal_1(self):
return self.balance_1
def getBal_2(self):
return self.balance_2
def run(count):
p1 = Player()
print("Inside run func")
global globalBal_1, globalBal_2
for i in range(count):
rolls = randint(0, 2, 10)
p1.strat_1(rolls)
p1.strat_2(rolls)
globalBal_1 += p1.getBal_1()
globalBal_2 += p1.getBal_2()
print("Finished run func")
if __name__ == '__main__':
start = time.time()
procs = [Process(target=run, args=(rounds,)) for t in range(threads)]
for p in procs:
p.start()
for p in procs:
p.join()
tempEnd = time.time()
print("Multiprocessing result:")
print(globalBal_1, globalBal_2, tempEnd - start)
print("\nSingle process:")
run(rounds)
end = time.time()
print(globalBal_1, globalBal_2, end - start)
感谢@mirmo 和@Bing Wang 的解决方案:
def runMulti(count, result1, result2):
p1 = Player()
for i in range(count):
rolls = randint(0, 2, 10)
p1.strat_1(rolls)
p1.strat_2(rolls)
result1.value += p1.getBal_1()
result2.value += p1.getBal_2()
[...]
profit1 = Value('i', 0)
profit2 = Value('i', 0)
procs = [Process(target=runMulti, args=(rounds, profit1, profit2)) for t in range(threads)]
请始终包含实际和预期的 output。
全局变量不会更新,因为现在创建了 4 个单独的进程(因此称为多处理),它们无法访问您创建的全局变量,或者更具体地说,无法访问父进程的全局变量。
返回每个进程的值并在最后将它们相加,创建一个队列或如上所述使用共享的 object。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.