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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:22:56