2015-07-02 7 views
2

Я хотел бы передать список значений и каждый из них прошел как независимая Тема:Threading в списке аргументов

Например:

import time 
import threading 

list_args = [arg1, arg2, arg3, ...., argn] 

# Code to execute in an independent thread 
import time 
def countdown(n): 
    while n > 0: 
     print('T-minus', n) 
     n -= 1 
     time.sleep(0.5) 


# Create and launch a thread 
t1 = threading.Thread(target=countdown, args=(arg1,)) 
t2 = threading.Thread(target=countdown, args=(arg2,)) 
. 
. 
. 
tn = threading.Thread(target=countdown, args=(argn,)) 
t1.start(); t2.start(); tn.start() 

ответ

1

быстро исправить

Позвоните по номеру .join() по каждому из ваших t1, t2 и т. Д. В конце.

Подробности

Я подозреваю, что ваш реальный вопрос "почему не countdown называют? Метод Thread.join() заставляет основной поток ждать, пока другие потоки закончат выполнение перед продолжением. Без него, как только основной поток заканчивается, он завершает весь процесс.

В вашей программе, когда основной поток завершает выполнение, процесс завершается вместе со всеми его потоками, прежде чем последний может вызвать свои функции countdown.

Другие вопросы:

  1. Лучше всего включать minimum working example. Ваш код не может быть выполнен как написано.

  2. Обычно для управления потоками используется некоторая структура данных. Это хорошо, потому что он делает код более компактным, общим и многоразовым.

  3. Не требуется импорт time дважды.

Это может быть близко к тому, что вы хотите:

import time 
import threading 

list_args = [1,2,3] 

def countdown(n): 
    while n > 0: 
     print('T-minus', n) 
     n -= 1 
     time.sleep(0.5) 


# Create and launch a thread 
threads = [] 
for arg in list_args: 
    t = threading.Thread(target=countdown,args=(arg,)) 
    t.start() 
    threads.append(t) 

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

Спасибо за комментарии, Так как я не был уверен в возможности вызова нити в петле, я оставил его в ближайшем приближении. –

0
import time 
import threading 

list_args = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 

# Code to execute in an independent thread 
def countdown(n): 
    while n > 0: 
     print('T-minus', n) 
     n -= 1 
     time.sleep(0.5) 


# Create and launch a thread 
for item in list_args: 
    thread = threading.Thread(target=countdown, args=(item,)) 
    thread.start() 
0

Я думаю, что это будет делать то, что вы описываете:

for a in list_args: 
    threading.Thread(target=countdown, args=(a,)).start() 
0

Вы можете добавить все темы в списке быть независимым от числа аргументов. В конце вашей основной программы вы должны присоединиться ко всем потокам. В противном случае основной поток выйдет и завершает все остальные потоки.

Рабочий код:

import time 
import threading 

# create list [0, 1, ..., 9] as argument list 
list_args = range(10) 

# Code to execute in an independent thread 
def countdown(n): 
    while n > 0: 
     print('T-minus', n) 
     n -= 1 
     time.sleep(0.5) 

if __name__ == '__main__': 
    threads = [] 

    # create threads 
    for arg in list_args: 
     threads.append(threading.Thread(target=countdown, args=(arg,))) 

    # start threads 
    for thread in threads: 
     print("start") 
     thread.start() 

    # join threads (let main thread wait until all other threads ended) 
    for thread in threads: 
     thread.join() 

    print("finished!") 
+0

Отличный ответ, но он не работает с этим определением списка. – rjonnal

+0

Да, это правда, я просто оставил его, как было в вопросе. я изменю его на строку, которую я использовал для тестирования вчера. – Felix

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