Python IDLE совместим с многопоточностью? - PullRequest
6 голосов
/ 01 июля 2010

Кажется, что IDLE (часть стандартной установки Python для Windows) не будет правильно выполнять многопоточные программы без неприятных зависаний или аварийных сбоев. Кто-нибудь знает способ исправить это?

Следующая программа всегда будет зависать в режиме IDLE, но завершаться нормально при выполнении непосредственно с интерпретатором 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!

вывод при использовании IDLE Функция «Run Module» всегда зависает бесконечно примерно в то время, когда на моей машине показывается строка 23 или 24.

Ответы [ 3 ]

2 голосов
/ 30 марта 2015
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 голосов
/ 23 августа 2012

У IDLE есть некоторые известные проблемы, когда дело доходит до многопоточности. Я не знаю подавляющего количества о деталях , почему это проблема, потому что я изо всех сил стараюсь держаться подальше от IDLE, но я знаю, что это так. Я настоятельно рекомендую вам просто взять IronPython и Python Tools для Visual Studio. Инструменты отладки VS абсолютно не имеют себе равных, особенно учитывая огромную библиотеку дополнений.

0 голосов
/ 01 июля 2010

AFAIK, это чушь, когда запускается многопоточный код в IDLE. IDLE использует GIL свободно, поэтому условия гонки и взаимоблокировки являются общими. К сожалению, я недостаточно хорошо разбираюсь в потоках, чтобы предложить понимание того, как сделать этот потокобезопасным, помимо очевидного.

...