繁体   English   中英

Python 多处理过程 Class 的问题

[英]Problems with Pythons Multiprocessing Process Class

我目前正在尝试进入 Python。 为了解释下面的代码,您可以看到一个程序来比较轮盘赌中的两种策略并运行多次。

  1. 在开始前不知道命中是什么的颜色加倍策略。
  2. 知道红色之前被击中 10 次的颜色加倍策略,所以我从起始值乘以 2^10 开始

玩家” 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM