2010-06-30 92 views
5

似乎IDLE(標準Python Windows安裝的一部分)不會正確執行多線程程序,而不會出現令人討厭的掛起或bugout崩潰。有誰知道一種方法來解決這個問題?Python IDLE與多線程兼容?

當與Python解釋直接執行下面的程序將總是在IDLE但完全正常掛:

import threading, time 

printLock = threading.Lock() 

def pl(s): 
    printLock.acquire() 
    print s 
    printLock.release() 

class myThread(threading.Thread): 
    def run(self): 
    i = 0 
    for i in range(0,30): 
     pl(i) 
     time.sleep(0.1) 

t = myThread() 
t.start() 

while threading.activeCount() > 1: 
    time.sleep(1) 
    pl(time.time()) 

print "all done!" 

輸出樣本:使用IDLE「運行模塊」時

U:\dev\py\multithreadtest>python mt.py 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
1277935368.84 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
1277935369.84 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
1277935370.84 
1277935371.84 
all done! 

輸出功能總是在我的機器上顯示23或24行的時候,無限期地掛起。

回答

2

AFAIK當在IDLE中運行線程代碼時,它是一個廢話。 IDLE寬鬆地使用GIL,所以競爭條件和僵局很常見。不幸的是,我不太瞭解線程以提供有關使線程安全的見解,而不是顯而易見的。

+2

IDLE是用Tkinter編寫的,而不是WxPython。 – 2012-08-23 20:23:59

+0

空閒是用Python編寫的,Python代碼不直接使用GIL。 AFAIK,Idle對線程模塊的使用僅限於線程和條件類以及current_thread函數。 – 2015-03-29 22:41:14

1

IDLE在涉及到線程時存在一些已知問題。我不知道關於的詳細信息的壓倒一切的數量爲什麼這是一個問題,因爲我盡我所能遠離IDLE,但我知道它是。我強烈建議你去Visual Studio的IronPython和Python工具。 VS的調試工具絕對是無與倫比的,尤其是考慮到大量的附加組件。

1
import threading 
print(threading.activeCount()) 

在命令行運行時打印1個,從空閒運行時打印2個。所以你的循環

while threading.activeCount() > 1: 
    time.sleep(1) 
    pl(time.time()) 

將終止在控制檯,但永遠繼續在空閒。

在導入完成後固定在發佈代碼的問題,加上類似於

initial_threads = threading.activeCount() 

和環頭更改爲

while threading.activeCount() > initial_threads: 

隨着這一變化,代碼經過30次循環運行, 「全部完成!」停下來。我已經將這添加到我需要記錄的控制檯Python與空閒差異列表中。

+0

在任何其他託管環境下運行時或者當模塊不是第一個導入線程時,可能會發生threading.activeCount'開始'高於1的相同問題。 – 2015-03-29 23:47:43