我正在使用SIMPY来模拟一个队列,并且我需要表示服务中心的函数,以便除非某个条件为真,否则不会从Store队列中获得订单.但是,当我添加if语句行时,环境中的所有其他进程都停止提供反馈,好像这个进程使用了所有的计算能力一样.我不明白为什么他们会这样做,因为在我添加if语句之前,它工作得很好.

以下是代表服务中心的功能的代码: order_queue等于simpy.store(env) format_time只是将时间格式化为小时、分钟和秒 在添加IF语句之前:

def process_orders(env, order_queue):
    while True:
        order = yield order_queue.get()
        print(f"{format_time(env.now)}: {order.name} in service centers")
        order.exit_time = env.now
        #pauses this function for the preparation time, mimicking the service center creating the order
        yield env.timeout(order.prep_time)

        waiting_time = order.exit_time - order.placement_time
        print(f"{format_time(env.now)}: {order.name} exited at {env.now:.3f} minutes. Waiting time: {waiting_time:.3f} minutes.")
        waiting_times.append(waiting_time)

添加if语句后:

def process_orders(env, order_queue):
    while True:
        if (len(order_queue.items) > 0) and (round(env.now, 5) >= round(order_queue.items[-1].start_prep, 5)):
          order = yield order_queue.get()
          print(f"{format_time(env.now)}: {order.name} in service centers")
          order.exit_time = env.now

          # pauses this function for the preparation time, mimicking the service center creating the order
          yield env.timeout(order.prep_time)

          waiting_time = order.exit_time - order.placement_time
          print(f"{format_time(env.now)}: {order.name} exited at {env.now:.3f} minutes. Waiting time: {waiting_time:.3f} minutes.")
          waiting_times.append(waiting_time)

我试图让简单的if语句包含相同的条件,并在输入它们并注释掉函数的其余部分时进行打印.If语句起作用了,我可以看到它们被打印出来.

我试着用VScode调试的另一件事是,当我点击下一个箭头时,它停留在原处,永远不会进入if语句行.

推荐答案

粗略地浏览一下simpy文档就会发现,它是基于某种形式的基于事件的系统运行的,它需要提示才能知道何时是wait and for how long via timeout.不过,一般而言,即使对于生成器来说,在Pythonwhile True循环中,在遇到yield之前,它只会独占地持有线程.由于您没有yield作为替代选项(即在else块中),线程将保持,直到匹配有效条件以生成yield.

快速解决您的问题(没有反馈)的方法是简单地添加以下内容:

if (len(order_queue.items) > 0) and ...:  # other conditions omitted
    ...  # existing code omitted
else:
    yield env.timeout(1)

这将确保控制权交还给simpy,这样它就可以继续它正在做的工作.一种更好的方法是计算出您需要的准确超时时间,例如,在下一次订单到来之前的超时时间.

此外,这个process_orders函数有效地充当了一个"协同 routine "--this explanation在很大程度上总结了这意味着什么,并且应用该解释清楚地表明,如果函数从未及时地将控制权转移回调用函数yield,则不会发生将控制权转移回调用函数的情况(这将是simpy永远不能更新/提供反馈/做任何事情).

Python相关问答推荐

基于字符串匹配条件合并两个帧

如何将一个动态分配的C数组转换为Numpy数组,并在C扩展模块中返回给Python

如何让这个星型模式在Python中只使用一个for循环?

如何根据一列的值有条件地 Select 前N组?

Python中的变量每次增加超过1

考虑到同一天和前2天的前2个数值,如何估算电力时间序列数据中的缺失值?

幂集,其中每个元素可以是正或负""""

跳过嵌套JSON中的级别并转换为Pandas Rame

为什么在FastAPI中创建与数据库的连接时需要使用生成器?

ModuleNotFoundError:没有模块名为x时try 运行我的代码''

在Django中重命名我的表后,旧表中的项目不会被移动或删除

有了Gekko,可以创建子模型或将模型合并在一起吗?

如何在表单中添加管理员风格的输入(PDF)

某些值的数值幂和**之间的差异

将参数从另一个python脚本中传递给main(argv

根据边界点的属性将图划分为子图

401使用有效的OAuth令牌向Google Apps脚本Web App发出POST请求时出现未经授权的错误(";

判断字典中是否有多个值对

PYTORCH-张量问题-Mat1和Mat2形状不能相乘(8x10和8x8)

用于从项目问题描述中提取文本的Selify代码