python多处理中的共享变量

时间:2017-10-26 19:21:12

标签: python multiprocessing shared-memory

基本上,'刷新'是一个缓存功能,而打印机'旨在将结果提供给输出。 显然,这个例子在某些时候失败了,遗憾的是,python docs对此毫无帮助。 除了解释之外,工作代码将受到高度赞赏。

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()

2 个答案:

答案 0 :(得分:1)

当您编写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()

答案 1 :(得分:0)

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内容