假设我有3个任务:
def task1():
if check_if_theres_work_to_do(): #just checking takes 2us
do_work() #takes 10us
task2和task3定义类似
我有一个CPU。一种常见的嵌入式方法是执行以下操作:
def round_robin():
while True:
task1()
task2()
task3()
现在,我想在Simpy中模拟这个,但是如果没有任何工作可以执行任何任务,我不想经常循环round_robin
代码(因为这会增加模拟时间),但是我希望一次只能运行一个任务。此外,我想模拟这样一个事实:当工作变得可用时,例如对于task2,在task2()执行之前可能需要一些时间(处理器正在忙于检查其他任务是否有工作要做/正在为其他任务工作)。
在Simpy中,我已经定义了每个事件都在事件上产生的任务(例如,队列中的工作项):
def task1():
work_item = yield task1_work_queue.get()
do_task1_work(work_item)
但是如果我使用env.process(task1()); env.process(task2()); env.process(task3())
,那么它们都可以并行运行,这不能准确地模拟while循环的行为。
我认为可能有一种方法是定义一个名为CPU的资源cpu = Resource()
,然后让任务在获取work_item时产生,然后在获取cpu时产生,然后在0之间产生随机的时间量和2 *其他任务的数量:
def task1():
work_item = yield task1_work_queue.get()
with cpu.request() as req:
yield req
yield env.timeout(4)
do_task1_work(work_item)
但这似乎有点混乱,因为任务必须知道cpu正在执行多少其他任务。
有更好的方法对此进行建模吗?我是否应该在请求cpu然后等待获取工作时有一个进程收益,但让工作中的等待可以中断(这样一个没有工作的任务不会阻止那些有工作的任务)?
答案 0 :(得分:1)
您可以编写一个将所有任务放入队列的流程(例如,容量不受限制的Store
)。
您的“cpu”可以执行以下操作:
def cpu(env, work_q):
while True:
task, args = yield work_q.get()
yield env.timeout(3) # task setup
yield env.process(task(*args)) # run actual task