2013-06-12 114 views
7

我一直玩弄在Python腳本中使用time.sleep(n)的想法,使它在不同的時間間隔執行作業。該僞代碼將如下所示:Python - is time.sleep(n)cpu密集?

total_jobs = [...] 

next_jobs_to_run = next_closest(total_jobs) 
min_time_to_wait = closestTime(nextJobsToRun) 

wait until min_time_to_wait 
run them all 
get next jobs 

總而言之,程序會休眠直到下一個任務需要執行。它運行這項工作,發現下一份工作要運行,然後睡覺,直到需要運行下一份工作(繼續無限)。我打算在linux機器上運行這個工具 - 使用cron作業是一種可能性。任何人都有意見嗎?

+1

標題和問題無關? – Serdalis

+0

@Serdalis:他們不是同一個問題,但他們絕對相關。如果「睡眠」確實忙於等待,那麼幾乎可以解決使用哪一個問題(有利於「不睡眠」)的問題;如果不這樣做,那麼這個問題就會出現。 (當然,事實證明,事實並非如此。) – abarnert

回答

21

不,它不是CPU密集型的。

The documentation說:

暫停爲給定秒數執行。

Python實際上並不能保證在每一個可能的實現中,這意味着OS永遠不會在睡眠期間安排你的進程。但是在每個平臺上,Python都會嘗試在不使用任何CPU的情況下,在指定的時間內執行適當的操作。在某些平臺上,這可能仍然意味着一點點的CPU,但它將盡可能少地合理。

特別是,既然你問關於Linux,想必CPython的:

在Linux上,和大多數其他POSIX平臺上,它通常會使用select。請參閱the 3.3 source

man page很明顯,select掛起,直到信號,超時或就緒I/O(在這種情況下,沒有fds,所以後者是不可能的)。

你可以閱讀內核源代碼的全部細節,但基本上,除非有任何意外的信號,否則根本不會安排任何計劃,除非可能在select的最開始處有一小部分旋轉(作爲幾乎可以立即返回select的情況優化)。


在你總結的中間,從問題的變化「是sleep CPU密集型」向「我要使用sleep,或cron作業?」

無論哪種方式,您在等待時都不會燃燒任何CPU。有一些優點和缺點,但其中大多數都是微不足道的。從(大致和主觀上)最重要的是至少一個cron作業:

  • 允許配置 - 例如,改變計劃 - 無需編輯源代碼。
  • 需要配置才能正常工作。
  • 意味着更少的代碼 - 意味着更少的錯誤,並且對於未來的讀者而言更少理解。
  • 將持續在系統關閉。
  • 即使腳本以異常或信號退出,也會再次觸發。
  • 如果它的預定時間間隔錯過N次(未指定,並且不同的cron實現做不同的事情),則可以觸發0,1或N次,而不是保證0.
  • 有更好的處理機會系統時鐘改變。
  • 每次啓動時都必須支付進程啓動,解釋器啓動等。
  • 不會浪費頁表和進程表空間,因爲沒有進程正在運行,也沒有內存映射。
3

不,它不是處理器密集型的。它讓處理器閒置。

根據the documentation,它暫停執行,這意味着它不是處理器密集型的。 A busy wait會是處理器密集型的。