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



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

因为我不一定感兴趣的是每辆车需要多长时间才能获得燃料,而是在不同的需求场景下,燃料站需要多长时间才会耗尽燃料,所以我想限制我的模拟,这样它就不会产生汽车,除非有泵可用。

我不知道如何使Resource类与汽车生成器通信可用性,所以我目前只按固定的时间间隔生成汽车,但我会检查队列长度,以确保汽车向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, 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
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")

我知道这并不是你所问的,但如果你忽略了在没有可用泵的情况下产生的汽车,该怎么办?

如果这是可以的;如果gas_station.count((<8:";将完成这项工作。

检查下面的代码。

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))