You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现每秒并行运行带动态更新参数的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:00:57