首页 > 解决方案 > 如何使用多处理在 python 中共享列表

问题描述

我正在尝试共享对列表的访问权限,每次按下热键 'q'时,我都想追加并获得与每次按下时处理 ['something'] 相同的结果而是输出进程b是 [] 而不是 ['something'] 等。

from multiprocessing import Process
from pynput import keyboard
from time import sleep

list1 = list()


def on_press(key):
    if str(key).replace("'", '') == 'q':
        list1.append('something')
        print(f'process a: {list1}')


def keysinput():
    global listener
    while True:
        with keyboard.Listener(on_press=on_press) as listener:
            listener.join()


def printsharedlist():
    while True:
        print(f'process b: {list1}')
        sleep(3)


if __name__ == '__main__':
    a = Process(target=keysinput)
    a.start()
    b = Process(target=printsharedlist)
    b.start()

按'q'后输出

process a: []
process b: ['something']

按“q”后预期

process a: ['something']
process b: ['something']

标签: pythonlistmultiprocessingshare

解决方案


我找到了一个方法:

from multiprocessing import Manager, Process
from pynput import keyboard
from time import sleep


def on_press(key):
    global listreturn
    if str(key).replace("'", '') == 'q':
        print(key)
        listreturn = 'something'
        return listener.stop()


def keysinput(list2):
    global listener
    while True:
        print(f'process a: {list2}')
        with keyboard.Listener(on_press=on_press) as listener:
            listener.join()
        list2.append(listreturn)


def printsharedlist(list2):
    while True:
        print(f'process b: {list2}')
        sleep(3)


if __name__ == '__main__':
    manager = Manager()
    list1 = manager.list()
    a = Process(target=keysinput, args=(list1,))
    b = Process(target=printsharedlist, args=(list1,))
    a.start()
    b.start()
    a.join()
    b.join()

推荐阅读