Python multiprocessing结合Value、Lock实现指定输出问题求解
多进程计数轮询打印实现
核心要求
- 基于
multiprocessing模块实现双函数结构 - 第一个函数负责接收用户输入的起止数值、姓名列表
- 第二个函数固定命名为
set,必须包含name、item、iter_stop、lock四个必填参数,负责打印逻辑 - 必须使用
Process、Lock、Value三个核心组件 - 输入示例:
- 起止数值:
0 4 - 姓名列表:
Alex Jenn Jack
- 起止数值:
- 期望输出:
Alex 0 Jenn 1 Jack 2 Alex 3 Jenn 4
原有代码问题
- 共享计数
Value的初始值没有和用户输入的起始值绑定,存在逻辑断层 set函数没有做循环判断、终止条件校验,无法实现从起始值到终止值的连续计数- 进程创建、参数传递逻辑错误,没有正确给
set函数传入要求的四个参数 - 原计数逻辑是先自增再打印,和要求的从起始值开始输出的规则不符
- 没有实现姓名列表轮询匹配计数的逻辑,无法对齐期望输出格式
修正后可运行代码
from multiprocessing import Process, Lock, Value import time def set(name, item, iter_stop, lock): """ 按计数轮询打印姓名和对应数值 :param name: 当前进程绑定的姓名 :param item: 共享内存计数Value对象 :param iter_stop: 计数终止值 :param lock: 进程互斥锁 """ while True: with lock: current_num = item.value # 计数超过终止值直接退出进程 if current_num > iter_stop: return # 打印当前姓名和计数值 print(f"{name} {current_num}") # 计数值自增 item.value = current_num + 1 # 短暂休眠避免单个进程长期占用锁,保证轮询顺序 time.sleep(0.001) def task_init(): # 接收用户输入 start, iter_stop = map(int, input().split()) players = input().split() # 初始化共享计数器,初始值为输入的起始值 count_item = Value('I', start) # 初始化互斥锁 process_lock = Lock() process_pool = [] # 为每个姓名创建独立进程 for player in players: p = Process(target=set, args=(player, count_item, iter_stop, process_lock)) process_pool.append(p) p.start() # 等待所有进程执行结束 for p in process_pool: p.join() if __name__ == '__main__': task_init()
逻辑说明
- 用
Value做跨进程共享的计数器,所有进程共同操作同一个计数变量,保证计数连续不重复 - 用
Lock做互斥控制,同一时间只有一个进程能执行打印、计数自增操作,避免输出混乱、计数重复 - 每个进程绑定一个姓名,抢到锁就打印当前绑定的姓名和计数值,之后计数器自增,释放锁后短暂休眠让出CPU,保证姓名按列表顺序轮询
- 当计数器值超过输入的终止值时,所有抢到锁的进程会直接退出,程序结束
内容的提问来源于stack exchange,提问作者Mister X
相关产品推荐
相关产品推荐

