首页 > 解决方案 > 如果当时所有资源都在使用,如何忘记客户

问题描述

我有一台服务器,一次最多可以为 3 个客户提供服务。我已将其建模为 SimPy Resourcecapacity=3如下所示。我如何更新我的代码,以便每当有新客户到达时,如果正在使用服务器的所有容量,新客户就会被遗忘?

我已阅读文档,但找不到适合这种情况的示例。


SERVERS= 3

class Servers:

    def __init__(self, env):
        self.cashier = simpy.Resource(env, capacity= SERVERS)

def Customer(name, env, servers):
    print('Customer %s arriving at %s' % (name, env.now))
    with servers.cashier.request() as req:
        yield req
        print('Customer %s starts being served at %s' % (name, env.now))
        yield env.timeout(35)
        print('Customer %s done served at %s' % (name, env.now))

def customer_generator(env, servers):
    for i in range(100):
        env.process(Customer(i, env, servers))
        yield env.timeout(5)

env = simpy.Environment()
servers = Servers(env)
cus_generator = env.process(customer_generator(env, servers))
env.run(1000)

标签: simpy

解决方案


SimPy 提供了一种简单的方法来检查当前正在使用的资源容量。这可以使用<resource>.count链接到 API)来完成。

您的示例可以修改如下:

SERVERS= 3

class Servers:

    def __init__(self, env):
        self.cashier = simpy.Resource(env, capacity= SERVERS)

def Customer(name, env, servers):
    print('Customer %s arriving at %s' % (name, env.now))

    # check if any of the cashiers are free:
    if servers.cashier.count < servers.cashier.capacity:
        with servers.cashier.request() as req:
            yield req
            print('Customer %s starts being served at %s' % (name, env.now))
            yield env.timeout(35)
            print('Customer %s done served at %s' % (name, env.now))
    else:
        print('Customer %s leaving as there was no cashier free to serve them' % (name))

def customer_generator(env, servers):
    for i in range(100):
        env.process(Customer(i, env, servers))
        yield env.timeout(5)

env = simpy.Environment()
servers = Servers(env)
cus_generator = env.process(customer_generator(env, servers))
env.run(1000)

请注意,else当函数结束时,客户进程会在分支中自动销毁(忘记),而不会碰到另一个yield.


推荐阅读