python 如何在使用多处理时动态更改函数中变量的值

icnyk63a  于 2023-01-29  发布在  Python
关注(0)|答案(1)|浏览(117)

我怎样才能动态地改变list的值,使它每秒输出一个列表,其中最后一个元素是前一个列表的最后一个元素的2倍。

import time, multiprocessing

lis = [1, 2, 4]

def printer():
    while True:
        print(lis)
        time.sleep(1)

def updater():
    while True:
        time.sleep(1)
        lis.append(lis[-1]*2)

if __name__ == '__main__':
    process1 = multiprocessing.Process(target=updater)
    process2 = multiprocessing.Process(target=printer)

    process1.start()
    process2.start()

    process1.join()
    process2.join()

我需要输出像这样的东西

[1, 2, 4]
[1, 2, 4, 8]
[1, 2, 4. 8. 16]
[1, 2, 4, 8, 16, 32] 
.
.

但现在的输出是

[1, 2, 4]
[1, 2, 4]
[1, 2, 4]
[1, 2, 4] 
.
.

我尝试使用global lis,但也不起作用。

zpf6vheq

zpf6vheq1#

可以使用multiprocessing.Manager实现所需的行为。
管理器提供了一种创建可在不同进程之间共享的数据的方法。您可以在此处阅读更多信息。
根据服务器进程部分的示例,您可以如下重写代码:

import time, multiprocessing

def printer(_lis):
    while True:
        print(_lis)
        time.sleep(1)

def updater(_lis):
    while True:
        time.sleep(1)
        _lis.append(_lis[-1]*2)

if __name__ == '__main__':
    with multiprocessing.Manager() as manager:
        lis = manager.list([1, 2, 4])
        process1 = multiprocessing.Process(target=updater, args=(lis,))
        process2 = multiprocessing.Process(target=printer, args=(lis,))

        process1.start()
        process2.start()

        process1.join()
        process2.join()

相关问题