2013-10-11 6 views
0

У меня есть список H = [item1, item2, item3....so on] и функция,Threading в Python для каждого элемента в списке

def start(item1): 
    p1 = Do something to item1  
    return p1 

Я хочу старт функции должен выполняться параллельно для каждого элемента в списке H. Я знаю мультипроцессирование, но я уже имеют 4 списка, которые работают параллельно с использованием многопроцессорности. В то время как может быть достигнута резьба для каждого элемента в списке? Может кто-нибудь, пожалуйста, объясните это примером кода.

Спасибо!

+0

http://docs.python.org/dev/library/concurrency.html –

ответ

2

сделать функцию, которая выполняет заданную функцию в потоке и сохраняет результат:

import threading 
def run_item(f, item): 
    result_info = [threading.Event(), None] 
    def runit(): 
     result_info[1] = f(item) 
     result_info[0].set() 
    threading.Thread(target=runit).start() 
    return result_info 

Тогда другая функция, чтобы собрать результаты:

def gather_results(result_infos): 
    results = [] 
    for i in xrange(len(result_infos)): 
     result_infos[i][0].wait() 
     results.append(result_infos[i][1]) 
    return results 

Тогда из основного потока, говорят proc это функция, обрабатывающая элемент, и items - это ваш список товаров для обработки:

#start processing the items 
result_infos = [run_item(proc, item) for item in items] 
#gather the results (blocking) 
results = gather_results(result_infos) 
01 Использование

Пример:

>>> import time 
>>> def proc(item): 
...  time.sleep(2.0) 
...  return item * 2 
... 
>>> print gather_results([run_item(proc, item) for item in [1, 2, 10, 100]]) 
#2 seconds later... 
[2, 4, 20, 200] 
+0

Спасибо! это мне очень помогает. Еще одна вещь, если мой список содержит 10 000 элементов, будет выполняться 10 000 потоков параллельно? Сколько потоков мы можем запускать параллельно? Мой список содержит около 20 000 предметов. – user2766019

+0

@ user2766019: да, это будет работать столько же потоков, сколько и элементов. вы определенно не хотите этого делать. вы должны либо использовать threadpool, либо держать счетчик где-то так, если уже более 10 потоков уже обрабатываются, вы ждете, пока не появляетесь больше. – Claudiu

+0

Привет, очень жаль, но я новичок в программировании и не могу получить, где использовать threadpool, связанный с вышеуказанным кодом. Не могли бы вы объяснить threadpool, используя приведенный выше пример кода. Благодаря! – user2766019

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