>

파이썬 2에서 큐잉 시뮬레이션 모델을 작업 중입니다.이 시뮬레이션 모델은 시스템에 작업이 들어오고 여러 리소스를 요청합니다. 도착하는 각 작업은 특정 자원이 아닌 다른 양의 자원을 요구하고 다른 시간 동안 자원을 사용합니다.

이 예제는 res [1] 및 res [2]와 같은 특정 리소스 요청을 찾습니다. 2 개의 리소스 만 요청하면됩니다.

또한 내 작업은 첫 번째 작업이 완료된 후에 만 ​​실행됩니다. for 루프에 문제가 있음을 이해하지만 올바르게 수정하는 방법을 잘 모르겠습니다. 이 경우, 2 개의 자원이 있기 때문에 a와 b는 시간 1에서 실행될 수 있어야합니다. 그러나 b는 완료 될 때까지 기다립니다. 이상한.

여러 리소스를 요청하고 적절한 시간에 작업을 실행하는 데 도움을 주셔서 감사합니다.

여기까지 내 코드가 있습니다 :

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

  • 답변 # 1

    문제는 코드가 다음 루프로 넘어 가기 전에 한 번의 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)       
    
    

  • 이전 java - 요청 처리 스레드와 SocketChannel 선택기 스레드 간의 관계를 설정하는 방법은 무엇입니까?
  • 다음 python - 3 개의 데이터 프레임을 결합하는 데 문제가 있습니다파이 스파크