在Simpy中,如何同步两个进程以启动第三个进程?

2024-05-19 05:07:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用多台机器模拟一个制造过程。机器1的容积为1升。机器2的容积为2升。我们想生产2升化学品X,所以我们在机器1中加入1升原料。完成后,将1L移至机器2。同时,用第二批1L在机器1上运行另一轮。然后将其添加到已经填充了一半的机器2中。然后启动机器2,最终生产两升。如果机器1需要3小时,机器2需要12小时,则此过程将需要3+3+12=18小时

现在我的方法如下。我将Machine1创建为容量为1的资源,将Machine2创建为容量为2的资源。我希望在两批产品通过机器1后启动机器2。我的尝试代码如下:

import simpy
from collections import namedtuple

Chemical = namedtuple("Chemical", "name")

X_batch1 = Chemical("X_batch1")
X_batch2 = Chemical("X_batch2")


def do_process_1(env, machine1, Chemical):
    print(f"Chemical {Chemical.name} requested Machine1 at {env.now}")
    with machine1.request() as req:
        yield req
        print(f"Chemical {Chemical.name} got into Machine1 at {env.now}")
        yield env.timeout(3)
        print(f"Chemical {Chemical.name} got out of Machine1 at {env.now}")
        # yield env.timeout(2)


def do_process_2(env, machine1, machine2, Chemicals):

    # <some condition to check if process 1 is done for both Chemicals>

    # make each batch for machine2, one after the other
    print(f"{Chemicals[0]} asks for Machine2 at {env.now}.")
    print(f"{Chemicals[1]} asks for Machine2 at {env.now}.")
    with machine2.request() as req1, machine2.request() as req2:
        yield req1 & req2
        print(f"{Chemicals[0]} gets machine2 at {env.now}.")
        print(f"{Chemicals[1]} gets Machine2 at {env.now}.")
        yield env.timeout(12)
    print(f"{Chemicals[0]} got out of machine2 at {env.now}.")
    print(f"{Chemicals[1]} got out of machine2 at {env.now}.")


env = simpy.Environment()
machine1 = simpy.Resource(env, 1)
machine2 = simpy.Resource(env, 2)

env.process(do_process_1(env, machine1, X_batch1))
env.process(do_process_1(env, machine1, X_batch2))
env.process(do_process_2(env, machine2, machine1, (X_batch1, X_batch2)))
env.run(until=60)

我上面有两个路障:

  1. 只有在使用机器1完成两台机器后,才能请求机器2。我不知道如何添加此条件,以及在何处添加
  2. 机器2必须被请求两次(按不同批次),然后才能开始工作。当只有一个请求时,它不应该开始工作

任何帮助都将不胜感激


Tags: env机器processdonowatprintyield
1条回答
网友
1楼 · 发布于 2024-05-19 05:07:57

我用下面的代码解决了我自己的问题。简而言之,我将第一台机器的进程保存在一个变量中,并将该变量传递给第二台机器。然后我在第二台机器的过程中,用这个过程的产量

import simpy
from collections import namedtuple

Chemical = namedtuple("Chemical", "name")

X_batch1 = Chemical("X_batch1")
X_batch2 = Chemical("X_batch2")


def do_process_1(env, machine1, Chemical):
    print(f"Chemical {Chemical.name} requested Machine1 at {env.now}")
    with machine1.request() as req:
        yield req
        print(f"Chemical {Chemical.name} got into Machine1 at {env.now}")
        yield env.timeout(3)
        print(f"Chemical {Chemical.name} got out of Machine1 at {env.now}")
        # yield env.timeout(2)


def do_process_2(env, machine2, Chemicals, procs):

    yield env.all_of(procs)

    # make each batch for machine2, one after the other
    print(f"{Chemicals[0]} asks for Machine2 at {env.now}.")
    with machine2.request() as req1, machine2.request() as req2:
        yield req1 & req2
        print(f"{Chemicals[0]} gets machine2 at {env.now}.")
        yield env.timeout(12)
    print(f"{Chemicals[0]} got out of machine2 at {env.now}.")


env = simpy.Environment()
machine1 = simpy.Resource(env, 1)
machine2 = simpy.Resource(env, 2)

proc1 = env.process(do_process_1(env, machine1, X_batch1))
proc2 = env.process(do_process_1(env, machine1, X_batch2))
env.process(do_process_2(env, machine2, (X_batch1), (proc1, proc2)))
env.process(do_process_2(env, machine2, (X_batch2), (proc1, proc2)))
env.run(until=60)

相关问题 更多 >

    热门问题