【问题标题】:Running three functions at regular intervals - multithreading? multiprocessing? [duplicate]定期运行三个函数 - 多线程?多处理? [复制]
【发布时间】:2023-03-29 20:01:02
【问题描述】:

我曾问过一个非常相似的问题earlier,但项目范围正在迅速扩大,超出了信号可以带给我的范围(我认为)。基本上,我的程序将在三个不同的时间间隔内执行操作;每 15 秒执行一个函数,以可配置的时间间隔(通常为 5 到 60 秒)执行一个函数,每隔一两个小时执行一个函数。

从直观的角度来看,使用单独的函数调用多个 signal.signal() 似乎不会让我走得太远:ITIMER_REAL 计时器只发出一个信号——SIGALRM,因此无法区分哪个iter 正在发出信号。由于 15 秒间隔函数需要运行而不管其他函数可能发生什么,这让我可以选择多线程或多处理。

我倾向于多处理,希望我可以生成三个子进程,每个子进程都有自己的信号/定时器间隔,并让他们各自在闲暇时完成工作。这可行吗?如果不是,那么让这三个函数按所需时间间隔运行的最佳方法是什么?

【问题讨论】:

    标签: python multithreading signals multiprocessing


    【解决方案1】:

    这是可行的,但如果三个循环不做任何繁重的计算(需要多核能力),你也可以启动三个线程。

    或者,您可以使用priority queue 让单个循环处理此问题。将(time, task) 对推送到队列中,其中task 是对要完成的任务的一些描述。然后,在一个循环中:

    • 弹出一个项目
    • 等到指定的time到期
    • 执行任务
    • 通过将新项目推入队列,在 5 秒、15 分钟、2 小时后重新安排任务。

    【讨论】:

    • 我担心的是阻塞;其中一项任务涉及访问网站,如果该网站不可用,我不希望 15 秒间隔的任务因此而被耽搁。另外,我最初的想法是 MP 而不是 MT,因为信号文档 (docs.python.org/library/signal.html) 表明尝试从主线程以外的线程调用 signal.signal() 会引发错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多