python 多处理中的共享变量

Shared variable in python multiprocessing

基本上,'refresh'是一个缓存功能,而'printer'是为了服务结果输出。 显然,这个例子在某些时候失败了,不幸的是,python 文档对此没有帮助。 除了解释,工作代码将不胜感激。

from multiprocessing import Manager, Process
from random import randrange
import time

manager = Manager()
x = manager.list()

def refresh():
    global x
    while True:
        y = []
        for i in range(5):
            y.append(randrange(100))
        x = y
        time.sleep(0.2)

def printer():
    while True:
        global x
        print(x)
        # Mind the different interval compared to 'refresh'
        time.sleep(0.3)

if __name__=='__main__':
    p = Process(target=refresh)
    p.start()
    p1 = Process(target=printer)
    p1.start()

refresh 中,您不是在修改 x,而是在 替换 它:

def refresh():
    global x
    while True:
        y = []
        for i in range(5):
            y.append(randrange(100))

        ## IN THIS LINE HERE
        ##
        ## When you set x = y, you're replaced your manager.list() with
        ## a normal, unshared list.
        x = y

        time.sleep(0.2)

您可以将其替换为:

x[:] = y

这将替换 x 内容

当您编写 x = y 时,您将 manager.list() 对象替换为普通 list() 对象,不会共享任何内容。

如果您想继续使用此范例,可以使用命名空间对象:

n = manager.Namespace()

def refresh():
    ...
    n.x = y

def printer():
    ...
    print(n.x)

ps:您需要使用join等待子进程完成,否则Manager将随着主(父)进程退出而退出:

p.join()
p1.join()