python - 收听列表并在附加时执行某些操作
问题描述
我有一个 API 监听传入的请求并将它们转储到一个列表中。在一个单独的过程中,我想在附加列表时触发某种操作。我尝试实例化一个新进程(来自多处理),但它一旦启动就不会更新数组的状态。
from multiprocessing import Process
import time
procs = []
def separateProcess(start, counter):
while True:
time.sleep(1)
print("length of the list from separate Process: "+str(len(procs)))
if __name__ == '__main__':
print("program started")
counter = 0
Process(target=separateProcess, args=(counter, counter)).start()
print("program end")
while True:
counter += 1
newstring = "string "+str(counter)
procs.append(newstring)
print("length of the list from main: " + str(len(procs)))
time.sleep(2)
这是输出:
length of the list from main: 1
length of the list from separate Process: 0
length of the list from main: 2
length of the list from separate Process: 0
length of the list from separate Process: 0
length of the list from main: 3
length of the list from separate Process: 0
length of the list from separate Process: 0
解决方案
当创建一个新的子进程时,它会获得父进程地址空间的副本,但是任何后续更改(无论是父进程还是子进程)都不会反映在另一个进程的内存中。他们每个人都有自己的私有地址空间。
import time
from multiprocessing import Manager, Process
def separateProcess(start, counter):
while True:
time.sleep(1)
print("length of the list from separate Process: "+str(len(procs)))
if __name__ == '__main__':
m = Manager()
procs = m.list()
print("program started")
counter = 0
Process(target=separateProcess, args=(counter, counter)).start()
print("program end")
while True:
counter += 1
newstring = "string "+str(counter)
procs.append(newstring)
print("length of the list from main: " + str(len(procs)))
time.sleep(2)
这种方法有一些开销,因为它将生成一个子进程来托管Manager
服务器。
如果您可以调整工作进程逻辑以改用队列,这里是一个示例:
import random
import time
from multiprocessing import cpu_count, Process, Queue
def worker(q):
for item in iter(q.get, 'STOP'):
t = random.uniform(1, 5)
print(f'START item: {item}')
time.sleep(t)
print(f'END item: {item}, ({t:.3f}s)')
def main():
cpus = cpu_count()
q = Queue()
for i in range(5):
q.put(i)
for i in range(cpus):
Process(target=worker, args=(q,)).start()
for i in range(cpus):
q.put('STOP')
if __name__ == '__main__':
main()
推荐阅读
- python-sphinx - 'make' 不是内部或外部命令、可运行程序或批处理文件。[狮身人面像]
- javascript - 材质 UI - TreeView 数据结构
- design-patterns - 避免循环引用的设计模式
- postgresql - 如何将“created_timestamp”:1553678246 转换为日期 dd:mm:yyyy 格式
- javascript - 一些书签不在 iOS 上执行:如何调试?
- arrays - 在 Angular 中将数组转换为对象
- c# - 无法使用 C# 和 ADO.NET 添加到数据库
- c++11 - 从 decltype 中删除类成员类型部分
- angular - 在 Angular 中注入参数化依赖和手动引导
- phpstorm - 如何在提交窗口中显示未版本控制的文件