Simpy进程间变量传递:使用return是否合规且推荐?
关于SimPy进程间用return传递变量的问题解答
你的代码为什么能正常运行?
你之前的认知没错:return会终止当前进程(生成器),但你的代码里my_proc的while True根本没循环起来——第一次执行完yield env.timeout(2)后,return env.now直接终止了这个my_proc进程。而other_proc里的while True会不断调用env.process(my_proc(env)),每次都启动一个全新的my_proc实例,所以看起来像是循环输出,但本质是每次都在运行一个一次性的子进程。
这种传值方式是否正确?
是正确的。SimPy官方支持通过return语句将值从子进程传递给等待它的父进程:当子进程执行return时,会把返回值作为进程结束事件的value,父进程通过yield env.process(...)就能直接获取这个值。
是否为推荐做法?
分场景看:
- 如果你的需求是调用一次性子进程并获取其结果,这种方式非常推荐,简洁直观。
- 如果你的需求是让
my_proc持续运行、循环产生值并传递,那这种写法就不推荐了:每次return都会终止进程,你需要不断重启新进程,既低效也不符合“长期运行进程”的设计意图。
持续传值的替代方案
如果要实现持续运行的进程间传值,可以用SimPy的Store(队列)或者直接用事件传递:
方案1:用Store队列传递
import simpy as sp def my_proc(env, output_queue): while True: yield env.timeout(2) # 将值放入队列 output_queue.put(env.now) def other_proc(env, output_queue): while True: # 从队列取走值 ret_val = yield output_queue.get() print(env.now, ret_val) env = sp.Environment() output_queue = sp.Store(env) env.process(my_proc(env, output_queue)) env.process(other_proc(env, output_queue)) env.run(until=10)
方案2:用事件传递
import simpy as sp def my_proc(env): while True: yield env.timeout(2) # 创建事件并传递值 event = env.event() event.succeed(env.now) yield event def other_proc(env): proc = env.process(my_proc(env)) while True: ret_val = yield proc.next() print(env.now, ret_val) env = sp.Environment() env.process(other_proc(env)) env.run(until=10)
内容的提问来源于stack exchange,提问作者user15233037
相关产品推荐
相关产品推荐

