2013-11-20 88 views
1

我發現了tutorial about using multithreading in Python並查看了documentation限制每個線程的Python容量

雖然這些例子有效,但有些問題出現了。

在JavaScript中,一個無限循環一樣

while (true) { 
    console.log("I'm trapped in an infinite loop!"); // JavaScript nearly crashes. 
} 

打破我的瀏覽器執行,我只能通過終止進程逃脫。但是,在Python中,無限循環正常工作。我可以隨時停止它。這甚至結合其他線程:

我認爲一個無限循環將是所有最耗盡的任務。如果這是正確的,那就意味着Python會處理耗盡線程,以便其他線程不會停止。

這是我的問題:Python如何爲其底層線程分配容量?

try: 
    # How much capacity will thread 1 get? 
    thread.start_new_thread(very_exhausting_task, ("Thread-1",)) 
    # How much capacity will thread 2 get? 
    thread.start_new_thread(another_very_exhausting_task, ("Thread-2",)) 
except: 
    print "Error: unable to start thread" 
while 1: 
    pass 
+1

您需要闡明「如何控制容量?」網站格式支持每個帖子單個問題。因此,提出多個問題 - 每個問題都可以有不同的答案,而且誰的回答專業知識可能來自不同的用戶,應該分成多個問題 - 每個問題都側重於各自的部分。您的問題似乎主要是基於意見的,引起討論和辯論的有見地的答案也不適合本網站。我建議你做一些獨立的研究並返回一個堅實的問題。或者來到[Python聊天](http://chat.stackoverflow.com/rooms/6/python) –

+1

您似乎缺少對線程和調度概念的基本理解。閱讀http://en.wikipedia.org/wiki/Scheduling_%28computing%29即可開始使用;但要深入回答這個問題,需要一本關於操作系統和日程安排的好書或論文。你的問題是如何分配容量沒有多大意義 - python解釋器給線程一些CPU時間,並在中斷時突然釋放;這是重複的,除非線程結束。 – l4mpi

+0

感謝您的評論。我刪除了不必要的問題,並專注於我的主要問題。 – Xiphias

回答

1

該線程的「能力」是真的更多有關全球解釋器鎖(GIL)和你的工作負荷的特性設計決定的後果。

如果你不熟悉GIL,這個鎖使得它在任何時候只有一個線程可以使用解釋器。這對純Python代碼的線程(包括使用的任何庫)是最不利的。雖然可以有很多操作系統線程,但只有一個線程可以在給定的時間片內有效運行。

這也會影響必須與Python對象一起工作的C擴展。但是,擴展可以通過在執行I/O綁定工作(在網絡上交談等)時釋放GIL或在執行不需要Python對象的繁重處理時解決此限制。

我建議你先尋找到https://wiki.python.org/moin/GlobalInterpreterLock,讀取這些幻燈片組:http://www.dabeaz.com/python/UnderstandingGIL.pdfhttp://www.dabeaz.com/python/GIL.pdf

,可以找到關於一些合作多任務處理方面(自願釋放GIL)加上GIL所有權的優先權細節(跑過分配數量的指令)。後者是可調的(請參閱:http://docs.python.org/2/library/sys.html#sys.setcheckinterval