如何在 Python 中有效地限制 SimPy 生成的进程?

问题描述

我正在尝试使用 SimPy 创建一个模拟器,该模拟器模拟加油站耗尽容量所需的时间。这是一个模拟器,它生成一辆汽车,然后在队列中等待燃油泵可用。

因为我不一定对每辆汽车获取燃料需要多长时间感兴趣,而是对不同需求场景下加油站耗尽燃料所需的时间感兴趣,所以我想限制我的模拟,以便除非泵可用,否则它不会制造汽车。

我不确定如何让 Resource 类将可用性传达给汽车发电机,所以我目前只是在固定的时间间隔内生成汽车,但我检查了队列长度以确保在汽车产生之前不会太久请求资源。

如何使汽车发电机仅在资源可用时才创建汽车?

这是我目前的代码

import simpy
import random

def car(sim_env: simpy.Environment,station: simpy.Resource,pump: simpy.Container):
    # Checks queue,if it is long,don't create car
    if len(station.queue) < station.capacity + 5:
        # Creates random fuel needs for car,determine how much fuel is dispensed per unit of time
        fuel_needed = random.uniform(20,30)
        fuel_rate = 10
        # Try to go to a fuel pump
        with station.request() as req:
            yield req
            # Get fuel available,if no fuel available,raise error
            if pump.level >= fuel_needed:
                yield pump.get(fuel_needed)
                car_time = (fuel_needed / fuel_rate)
                yield sim_env.timeout(car_time)
            elif fuel_needed > pump.level > 0:
                car_time = (pump.level / fuel_rate)
                yield pump.get(pump.level)
                yield sim_env.timeout(car_time)
            else:
                print('No fuel at station,exiting simulation')
                raise ValueError

def car_generator(sim_env: simpy.Environment,pump: simpy.Container,generation_interval: tuple):
    low_interval = generation_interval[0]
    high_interval = generation_interval[1]
    while True:
        # Wait for car to arrive using car generation interval
        yield sim_env.timeout(random.uniform(low_interval,high_interval))
        sim_env.process(car(sim_env,station,pump))

if __name__ == '__main__':
    # Create simulation environment
    env = simpy.Environment()
    # Create a station with 8 pumps
    gas_station = simpy.Resource(env,8)
    # Specify the fuel capacity of the station to be 20000
    fuel_pump = simpy.Container(env,20000,init=20000)
    env.process(
        car_generator(env,gas_station,fuel_pump,(1,5)))
    # Run simulation
    try:
        env.run()
    except ValueError:
        print("Station out of gas")

解决方法

我知道这不是您要问的,但是如果您忽略没有可用泵时生成的汽车怎么办?

如果没问题,一个合适的“if gas_station.count()

检查下面的代码。

def car_generator(sim_env: simpy.Environment,station: simpy.Resource,pump: simpy.Container,generation_interval: tuple):
    low_interval = generation_interval[0]
    high_interval = generation_interval[1]
    while True:
        # Wait for car to arrive using car generation interval
        if gas_station.count() < 8:
           yield sim_env.timeout(random.uniform(low_interval,high_interval))
           sim_env.process(car(sim_env,station,pump))