如何实现每秒并行运行带动态更新参数的Python函数?
问题原因
Python多进程之间拥有独立的内存空间,你传入子进程的lst只是主进程列表的一份拷贝,子进程内部的list变量不会随着主进程中lst的更新同步变化,因此会出现反复使用初始参数值的情况。
解决方法
根据你的需求,有两种常用实现方式:
方式一:使用共享列表(适合持续修改同一集合的场景)
通过multiprocessing.Manager创建共享列表,它会启动后台服务进程,所有进程通过代理访问该列表,确保数据跨进程同步。
from multiprocessing import Process, Manager import time def foo(shared_list): while True: # 直接使用共享列表,可实时获取主进程的更新 print(f"当前处理的列表内容: {shared_list}") time.sleep(1) def main(): with Manager() as manager: # 创建跨进程共享的列表 shared_list = manager.list() # 注意args需写成元组形式,末尾逗号不能省略 process = Process(target=foo, args=(shared_list,)) process.start() # 主进程持续更新共享列表 count = 0 while True: shared_list.append(count) count += 1 time.sleep(1) process.join() if __name__ == "__main__": main()
方式二:使用队列(适合每次传递独立新参数的场景)
如果需求是每秒传递全新参数而非修改同一列表,multiprocessing.Queue是更合适的选择。队列是进程安全的,主进程往队列存参数,子进程从队列取参数处理。
from multiprocessing import Process, Queue import time def foo(queue): while True: # 阻塞等待新参数传入 current_param = queue.get(block=True) print(f"当前处理的参数: {current_param}") time.sleep(1) def main(): queue = Queue() process = Process(target=foo, args=(queue,)) process.start() # 主进程每秒生成新参数放入队列 count = 0 while True: queue.put(count) count += 1 time.sleep(1) process.join() if __name__ == "__main__": main()
注意细节
- 原代码中
args=(lst)是错误写法,必须写成args=(lst,),否则Python会将列表的每个元素拆分为单独参数传递给目标函数。 Manager创建的共享对象存在一定性能开销,适合数据量不大、更新频率不极高的场景;高频传递独立参数时,优先选择Queue。
内容的提问来源于stack exchange,提问作者Jay Kim
相关产品推荐
相关产品推荐

