2009-04-24 26 views
36

我有一個輪詢一個硬件的線程。threading.Thread如何在Python中產生剩餘的量子?

while not hardware_is_ready(): 
    pass 
process_data_from_hardware() 

但也有其他線程(和進程!)可能有事情要做。如果是這樣,我不想燒燬CPU每隔一個指令檢查硬件。我已經處理線程已經有一段時間了,而當我做了它不是Python,但我相信大多數線程庫都有一個yield函數或者一個讓線程告訴調度程序的東西「給其他線程一個機會。 「

while not hardware_is_ready(): 
    threading.yield()   # This function doesn't exist. 
process_data_from_hardware() 

但我在線程文檔中找不到像這樣的任何引用。 Python確實有一個yield語句,但我很肯定這是完全不同的東西(用於生成器)。

這裏要做的正確事情是什麼?

回答

55

time.sleep(0)足以產生控制 - 不需要使用正的epsilon。事實上,time.sleep(0)意味着「屈服於任何其他線程可能準備就緒」。

11

閱讀全局解釋器鎖(GIL)。

例如:http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/

另外:http://www.pyzine.com/Issue001/Section_Articles/article_ThreadingGlobalInterpreter.html

做到這一點在你的代碼,如果你必須做忙等待(如輪詢的設備)。

time.sleep(0.0001) 

這將產生的線程調度。

另外,我收集了一些筆記,並引用http://homepage.mac.com/s_lott/iblog/architecture/C551260341/E20081031204203/index.html

+2

我不是專家,但我讀過一些關於GIL的內容。你能否給我一個暗示,特別是與這個問題有關? 我現在要用'time.sleep(epsilon)',但它有點不令人滿意,不是嗎?沒有我想睡的特定時間間隔。 – 2009-04-24 22:45:11

+0

它是唯一的解決方案,如果你的硬件不能發送中斷。 – Unknown 2009-04-25 01:58:39

3

如果你這樣做是在* nix,你可能會發現select庫有用。 Kamaela也有一些您可能會覺得有用的組件,但它可能需要一些範例更改。