Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Simpy:请求多个(非特定)资源和请求顺序_Python 2.7_Simulation_Simpy_Queuing - Fatal编程技术网

Python 2.7 Simpy:请求多个(非特定)资源和请求顺序

Python 2.7 Simpy:请求多个(非特定)资源和请求顺序,python-2.7,simulation,simpy,queuing,Python 2.7,Simulation,Simpy,Queuing,我正在Python2中开发一个队列模拟模型,该模型中有作业进入系统并请求多个资源。每个到达的作业要求不同数量的资源(而不是特定的资源!),并在不同的时间内使用这些资源 我发现的任何此类示例都需要特定的资源,如res[1]和res[2]。我只需要请求2个资源 此外,我的作业仅在第一个作业完成后运行。我知道我的for循环有问题,但我不确定如何正确修复它。 在这种情况下,因为有两个资源a和b应该能够在时间1运行。但是b要等到a完成。奇怪 如果您能在适当的时间请求多个资源并运行作业,我将不胜感激 以下是

我正在Python2中开发一个队列模拟模型,该模型中有作业进入系统并请求多个资源。每个到达的作业要求不同数量的资源(而不是特定的资源!),并在不同的时间内使用这些资源

我发现的任何此类示例都需要特定的资源,如res[1]和res[2]。我只需要请求2个资源

此外,我的作业仅在第一个作业完成后运行。我知道我的for循环有问题,但我不确定如何正确修复它。 在这种情况下,因为有两个资源a和b应该能够在时间1运行。但是b要等到a完成。奇怪

如果您能在适当的时间请求多个资源并运行作业,我将不胜感激

以下是我目前的代码:

import simpy


#resource
class SuperComputer:
    def __init__(self, env):
        self.nodes = simpy.Resource(env, capacity = 2)


#users of resource
class Job:
    #enter: time the job enters the system
    #timeout is how long the job occupies a resource for
    #resources is how many resources a job needs in order to run
    def __init__(self, env, name, enter,timeout, resources):
        self.env = env
        self.name = name 
        self.enter = enter
        self.timeout = timeout
        self.resources = resources


#system
def system(env, jobs, super_computer):
    with super_computer.nodes.request() as req:

        for job in jobs:
            print('%s arrives at %s' % (job.name, job.enter)) 
            yield req
            yield env.timeout(job.enter)
            print('%s starts running with %s resources at %s' % (job.name, job.resources, env.now)) 
            yield env.timeout(job.timeout)
            print('%s completed job at %s' % (job.name, env.now)) 




env = simpy.Environment()
super_computer = SuperComputer(env) 

jobs = [
        Job(env, 'a', 1, 4, 1),
        Job(env, 'b', 1, 4, 1),
        Job(env, 'c', 1, 4, 1),
        Job(env, 'd', 1, 4, 1),
    ]


env.process(system(env, jobs, super_computer))    

env.run(50)        
输出:

a arrives at 1
a starts running with 1 resources at 1
a completed job at 5
b arrives at 1
b starts running with 1 resources at 6
b completed job at 10
c arrives at 1
c starts running with 1 resources at 11
c completed job at 15
d arrives at 1
d starts running with 1 resources at 16
d completed job at 20

问题是,代码需要先完成一轮for循环,然后再进行下一轮

如果for循环放在流程之外,那么代码就可以工作,而不是为每个作业创建一个新流程,从而允许它们并行运行

import simpy


#resource
class SuperComputer:
        def __init__(self, env):
        self.nodes = simpy.Resource(env, capacity = 2)


#users of resource
class Job:
    #enter: time the job enters the system
    #timeout is how long the job occupies a resource for
    #resources is how many resources a job needs in order to run
    def __init__(self, env, name, enter,timeout, resources):
        self.env = env
        self.name = name 
        self.enter = enter
        self.timeout = timeout
        self.resources = resources


#system
def system(env, job, super_computer):
    with super_computer.nodes.request() as req:
        print('%s arrives at %s' % (job.name, job.enter)) 
        yield req
        yield env.timeout(job.enter)
        print('%s starts running with %s resources at %s' % (job.name, job.resources, env.now)) 
        yield env.timeout(job.timeout)
        print('%s completed job at %s' % (job.name, env.now)) 


env = simpy.Environment()
super_computer = SuperComputer(env) 

jobs = [
        Job(env, 'a', 1, 4, 1),
        Job(env, 'b', 1, 4, 1),
        Job(env, 'c', 1, 4, 1),
        Job(env, 'd', 1, 4, 1),
    ]


for job in jobs:
    env.process(system(env, job, super_computer))    

env.run(50)        

非常感谢。这么简单的解决办法。对于如何为不同的工作请求多个资源,您有什么指导吗?目前,如果我有一个作业请求2个资源,我的print函数将打印出所请求的内容,但如果我请求req(job.resources),则req()不起作用