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

如何用multiprocessing实现循环?后台自增数值等待输入的代码求助

问题分析与修复方案

代码里的两个核心问题

  • 进程创建方式错误:创建mp.Process时,target参数应该传入函数本身(比如target=ask),而不是调用函数(target=ask())。你现在的写法会直接在主进程中执行ask()和add(),导致程序卡在input输入环节,根本没启动子进程。
  • 多进程全局变量不共享:Python多进程中,每个子进程会复制主进程的内存空间,所以add函数里修改的num和ask函数里的num是完全独立的两个变量,就算进程创建正确,ask也无法获取到递增后的数值。

修复后的代码

使用mp.Value创建共享内存变量来实现多进程间的数值共享,同时修正进程创建的写法:

import multiprocessing as mp
import time

def add(num):
    while True:
        # 加锁避免多进程操作冲突
        with num.get_lock():
            num.value += 1
        time.sleep(0.01)  # 加个小延迟,避免占用过多CPU

def ask(num):
    x = input("Input: ")
    print(f"你输入的内容: {x}")
    with num.get_lock():
        print(f"当前递增数值: {num.value}")

if __name__ == "__main__":
    # 创建共享整数变量,初始值0
    num = mp.Value('i', 0)
    # 进程target传函数名,args传参数
    p1 = mp.Process(target=add, args=(num,))
    p2 = mp.Process(target=ask, args=(num,))
    
    p1.start()
    p2.start()
    
    p2.join()  # 先等待输入进程结束
    p1.terminate()  # 终止递增进程,避免死循环一直跑

关键修改说明

  • 用mp.Value('i', 0)创建共享的整数变量,'i'表示类型为整数。
  • 操作共享变量时加get_lock(),避免多进程同时修改导致数据错误。
  • 进程创建时target传函数对象,args传入需要传递给函数的参数(注意是元组形式)。
  • 输入进程结束后,手动终止递增进程,因为add是死循环,不然程序会一直运行。

内容的提问来源于stack exchange,提问作者Estronoid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:30:46