gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:58:54 25 4
gpt4 key购买 nike

假设我有 3 项任务:

def task1():
if check_if_theres_work_to_do(): #just checking takes 2us
do_work() #takes 10us

任务2和任务3的定义类似

我有一个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 时获得进程 yield ,然后等待工作,但工作等待可中断(以便没有工作的任务不会阻塞有工作的任务)?

最佳答案

您可以编写一个流程,将所有任务放入队列中(例如,具有无限容量的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

关于python - 使用 Simpy 模拟嵌入式固件的离散事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45292183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com