【发布时间】:2020-03-02 00:46:45
【问题描述】:
我正在建模的系统具有需要以一系列任务形式进行维护的对象。目前在这个模型中,他们请求一个“工作地点”,然后一旦他们抓住了那个,他们就会请求他们完成第一个任务所需的必要的“工人”资源。任务是列表中的对象,是对其进行维护的对象的属性,并且一些任务网络允许并行完成多个任务。
就目前而言,我在 for 循环中迭代了任务列表,其中嵌套的 for 循环然后请求并抓住必要的“工人”,然后一旦所有“工人”在任务期间超时已被扣押。
with self.location.request() as loc_req: # request work location
yield loc_req # wait for work location
for task in self.tasks[:]:
t_duration = task.calc_duration(self)
if t_duration == 0: # skip tasks where probability sets duration to 0
continue
needs = task.resources[:]
## check if available workers are useful; if not, release them
task_cur_resources = []
for res,req in self.resources['available'].copy():
if res.worker_id in needs:
self.resources['busy'].add((res,req))
task_cur_resources.append((res,req))
needs.remove(res.worker_id)
else:
res.release(req)
self.resources['available'].remove((res,req))
## acquire all resources needed for task
for need in needs[:]:
priority = len(needs) # prioritize tasks closer to meeting needs
res = self.location.workers[need] # set resource to worker of type need
req = res.request(priority) # save the request object
yield req # wait for resource
## stash resource and request in order to release later
task_cur_resources.append((res, req))
self.resources['busy'].add((res,req))
needs.remove(res.worker_id)
## perform task with task duration timeout
yield self.env.process(task.perform(self, t_duration))
## make resources available
for worker in task_cur_resources:
self.resources['busy'].remove(worker)
self.resources['available'].add(worker)
for res,req in self.resources['available']:
res.release(req)
self.resources['available'] = set()
问题是这不允许并发任务完成。这些任务是按基于输入参数的正态分布持续时间顺序完成的。我如何更改此设置以允许在其前任完成且工作人员可用时完成任务?我尝试了一个 while 循环,该循环遍历任务列表和已完成其前任的计划任务,但由于我明显滥用 SimPy 和产量,我一直以无限循环结束。有什么想法吗?
【问题讨论】:
标签: python concurrency simulation modeling simpy