2013-12-13 3 views
1

У меня есть модуль, который импортирует потоки и использует threading.activeCount(), чтобы определить, когда все потоки выполнены. Я изначально написал свой модуль, используя стандартный интерпретатор python. Использование моего модуля в скрипте прекрасно, однако при импорте моего модуля в ipython и вызове функции, которая зависит от threading.activeCount(). Моя функция никогда не возвращается.python и ipython threading.activeCount()

Код:

for dev in run_list: 
    proc = threading.Thread(target=go, args=[dev]) 
    proc.start() 

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

Я заметил, что при первом импорте нарезания резьбы со стандартным интерпретатором и вызов threading.activeCount(), только один поток отсчитывается:

>>> import threading 
>>> threading.activeCount() 
1 
>>> threading.enumerate() 
[<_MainThread(MainThread, started 140344324941568)>] 

Однако при использовании IPython , начальный счет 2:

In [1]: import threading 

In [2]: threading.activeCount() 
Out[2]: 2 

In [3]: threading.enumerate() 
Out[3]: 
[<_MainThread(MainThread, started 140674997614336)>, 
<HistorySavingThread(Thread-1, started 140674935068416)>] 

Этот модуль используется различными организациями используя различные интерпретаторы для работы, так что мне интересно, есть ли лучший способ справиться с этим (желательно, все еще используя потоки)?

ответ

3

join ваши темы, а не полагаться на activeCount:

threads = [] 
for dev in run_list: 
    proc = threading.Thread(target=go, args=[dev]) 
    proc.start() 
    threads.append(proc) 

for proc in threads: 
    proc.join() 
+0

Отлично, спасибо за ответ! – siesta

+0

Как мне проверить, завершены ли все потоки в def main? Прямо сейчас у меня есть цикл While, пока ActiveCount == 0 Как я могу проверить это с помощью соединения? – Steelzeh

+0

Присоединение @Steelzeh ждет завершения резьбы. После присоединения вы знаете, что поток завершен, не проверив другого пути. –

Смежные вопросы