使用Simpy模拟嵌入式固件的离散事件

时间:2017-07-25 00:52:11

标签: python design-patterns simpy

假设我有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然后等待获取工作时有一个进程收益,但让工作中的等待可以中断(这样一个没有工作的任务不会阻止那些有工作的任务)?

1 个答案:

答案 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