Simpy技术疑问:subfunc打印的进程名为何是my_proc?
为什么Simpy子进程中
env.active_process指向父进程? 这是因为Simpy中,通过env.process()创建的子进程并不会替换当前的活跃进程标识,子进程是在父进程的执行上下文中被触发执行的,env.active_process始终指向当前推进的顶层父进程。
拆解你的代码执行流程:
- 初始化
env = simpy.Environment()后,env.active_process为None——此时没有任何进程在运行。 - 调用
env.step()时,Simpy启动顶层进程my_proc,将env.active_process设置为my_proc,所以my_proc内第一次打印的是my_proc。 - 当执行到
yield env.process(subfunc(env))时,Simpy创建subfunc的进程对象,但不会修改env.active_process的值——它仍然指向正在运行的my_proc。随后subfunc被立即执行,所以函数内打印的env.active_process.name自然是my_proc。 subfunc执行完毕后,子进程结束,父进程继续执行yield env.timeout(1),此时env.step()完成,env.active_process重置为None,所以最后两次打印的类型都是None。
补充说明:
Simpy的env.active_process设计用来标识当前被环境推进的顶层进程,子进程是依附于父进程的“子任务”,不会成为新的活跃进程。如果想获取子进程自身的引用,需要将子函数定义为生成器(Simpy要求进程必须是生成器),并且只有当子进程作为独立顶层进程启动时,env.active_process才会指向它自己。比如:
import simpy def subfunc(env): print(env.active_process.name) # 打印"sub_proc" yield env.timeout(0) env = simpy.Environment() sub_proc = env.process(subfunc(env)) sub_proc.name = "sub_proc" env.step()
内容的提问来源于stack exchange,提问作者user3732793
相关产品推荐
相关产品推荐

