比方说,我有3个任务模拟嵌入式固件。一个常见的嵌入式方法是做到以下几点:离散事件使用的simpy
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时拥有一个进程产量,然后等待正在进行的工作,但是可以让工作中的等待中断(以便没有工作的任务不会阻止确实有效的任务)?
谢谢,我结束了创建从资源继承了CPU的对象和定义的方法上叫块。产生cpu.block(process_time)产生一个本身产生self.request()的进程,然后产生self.env.timeout(process_time)。然后我从我的任务中产生cpu.block()。 – sheridp