Кажется, что НЕАКТИВНЫЙ (часть стандартной установки Windows Python) не выполнит многопоточные программы правильно без противного, зависает или катастрофические отказы отступления. Кто-либо знает о способе зафиксировать это?
Следующая программа будет всегда зависать в НЕАКТИВНОМ, но обычно завершаться при выполнении с интерпретатором Python непосредственно:
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!"
демонстрационный вывод:
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 разоблачает на моей машине.
AFAIK, при выполнении потокового кода в IDLE это сущий пустяк. IDLE широко использует GIL, поэтому условия гонки и тупики - обычное дело. К сожалению, я не настолько хорошо разбираюсь в потоковом коде, чтобы предложить свои соображения о том, как сделать его потокобезопасным, помимо очевидного.