使用全局声明的元组进行Python多处理

2024-04-25 12:47:36 发布

您现在位置:Python中文网/ 问答频道 /正文

在多重处理类中全局使用元组时遇到了一些问题。你知道吗

我的代码如下:

from multiprocessing import Pool

if __name__ == '__main__':
    jj = ()
    def f(x):
        global jj
        jj += (x*x,)

    # Section A
    #for ii in range(20):
    #    f(ii)
    #print (jj)

    # Section B
    pool = Pool(processes=4)
    pool.map(f, range(20))  
    pool.join()
    print (jj)

如果我只运行B节,我得到的元组jj是一个空元组。然而,如果我只运行A部分,我会得到一个长度为20的元组。你知道吗

为什么会这样?你知道吗


Tags: 代码namefromimportifsectionrange全局
1条回答
网友
1楼 · 发布于 2024-04-25 12:47:36

好的,正如Python multiprocessing global variable updates not returned to parent所解释的,全局状态在进程之间是不共享的。你知道吗

例如,可以使用multiprocessing.Queue共享状态。你知道吗

from multiprocessing import Pool, Queue

if __name__ == "__main__":
    jj = ()
    q = Queue()

    def f(x):
        global jj
        jj += (x * x,)

    def f_multi(x):
        q.put(x * x)

    # Section A
    for ii in range(20):
        f(ii)
    print(jj)

    # Section B
    pool = Pool(processes=4)
    pool.map(f_multi, range(20))
    pool.close()

    stop = "STOP"
    q.put(stop)
    items = []
    for i in iter(q.get, stop):
        items.append(i)

    print(tuple(items))

或者,您可以使用print(tuple(sorted(items)))以与Section A生成相同的顺序获取值。4个进程正在处理Section B中的任务,因此产生了“无序”结果。你知道吗

相关问题 更多 >