2012-03-10 45 views
2

我问了一个非常类似的问题earlier,但项目范围正在迅速增长,超出了信号可以让我(我认为)的地方。基本上,我的计划将在三个不同的时间间隔内进行。每15秒一个功能,一个功能在一个可配置的时间间隔(一般为5到60秒),一个功能每一个小时或两个。定期运行三个函数 - 多线程?多?

从直观的角度来看,似乎多个signal.signal()调用具有单独的函数并不会让我走得太远:ITIMER_REAL定时器只发出一个信号 - SIGALRM,因此将无法区分itimer正在发出信号。由于15秒间隔函数需要运行而不管其他函数可能发生什么,这使我可以选择多线程或多处理。我倾向于多处理,希望我可以产生三个子进程,每个子进程都有自己的信号/ itimer间隔,并让他们各自在闲暇时完成工作。这是可行的吗?如果不是的话,那么让这三个函数以期望的间隔运行的最佳方式是什么?

回答

3

这是可行的,但如果三个循环没有做任何繁重的计算(需要多核功率),那么您可以同时启动三个线程。

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

  • 弹出的项目
  • 等待直到指定time是由于
  • 执行任务
  • 重新计划任务后5秒,15分钟,2小时,不管,由将新项目推送到队列中。
+0

我的担心是封锁;其中一项任务涉及访问一个网站,如果该网站不可用,我不希望15秒间隔任务因此而被阻止。另外,因为信号文档(http://docs.python.org/library/signal.html)表明尝试从除主函数以外的线程调用signal.signal(),所以我在考虑MP而不是MT。线程会引发错误。 – 2012-03-10 15:27:24