python - 如何使用多处理在 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']
解决方案
我找到了一个方法:
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()
推荐阅读
- django - 此代码如何将两个类相互链接?
- wazuh - 用于 Wazuh 集成的 SSL conf
- python - 如果在更多 N 秒内没有答案然后返回 None 怎么做(因为如果没有发送消息,它将是无限的)
- python - 我想从 Azure 继承迭代器 ItemPaged - ItemPaged[TableEntity] 到 Stream (Python) 获取流对象。是否可以?
- node.js - 使用哪些 azure 服务(AKS 或 App 服务)在 azure 上部署多个 docker 容器(启用撰写)
- domain-driven-design - 对于作为域实体方法参数的接口,我应该使用什么包?
- azure - 是否有可能仅为 Sharepoint online 创建条件访问策略,不包括其依赖项,如 ms 团队?
- ansible - Ansible 失败的未定义变量
- python - 芹菜作业中的 Threadpool Python 未来似乎正在阻塞
- java - 尽管有 Retrolambda,但与缺乏支持 java 8 相关的错误