2012-03-10 43 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