2013-10-24 2 views
3

При использовании библиотеки потоков Есть ли способ присоединиться ко всем потокам, которые были созданы start_new_threads?python - присоединиться ко всем потокам после start_new_thread

, например:

try:  
    import thread 
except ImportError: 
    import _thread as thread #Py3K changed it. 

for url in url_ip_hash.keys(): 
    thread.start_new_thread(check_url, (url,)) 

Как присоединиться все темы?

+0

Как вы хотите присоединиться к ним? Вы имеете в виду, что хотите подождать, пока поток не завершится? – oleg

+0

Я хочу подождать, пока все потоки, созданные start_new_thread, не закончат свой звонок. – gal

ответ

15

Есть ли причина, по которой вы используете thread вместо рекомендуемого модуля Threading? Если нет, вы должны использовать объекты threading.Thread, которые имеют метод объединения:

from threading import Thread 


def check_url(url): 
    # some code 

threads = [] 
for url in url_ip_hash.keys(): 
    t = Thread(target=check_url, args=(url,)) 
    t.start() 
    threads.append(t) 

# join all threads 
for t in threads: 
    t.join() 
+0

Да, я знаю это решение, но разве нет способа сделать это в потоке lib? – gal

+1

Поскольку 'thread' не предоставляет вам метод' join', вы должны его реализовать самостоятельно. Что вы можете сделать: вы даете каждому методу 'check_url' дополнительный параметр (блокировка!). Каждый метод получает свой собственный замок, они не используют один и тот же. В конце 'check_url' вы отпустите блокировку. Это сигнал для вызывающего потока, который был завершен потоком. Вместо вышеупомянутых 'for t в потоках: t.join()', вы пытаетесь получить все блокировки, которые выполняются только в том случае, если все блокировки, где были выпущены (т. Е. Все методы 'check_url' закончены). –

+0

Звучит достаточно хорошо для меня :) – gal

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