2013-06-27 4 views
2

У меня есть огромный список информации, и моя программа должна анализировать каждую из них. Чтобы ускорить работу, я хочу использовать потоки, но я хочу ограничить их на 5. Поэтому мне нужно создать цикл с 5 потоками, и когда кто-то закончит свою работу, возьмите новую до конца списка. Но я не знаю, как это сделать. Должен ли я использовать очередь? На данный момент я просто запускаю 5 потоков самым простым способом: Спасибо!Выполнение темы 5 на 5

for thread_number in range (5): 
    thread = Th(thread_number) 
    thread.start() 

ответ

2

Отделите идею рабочего потока и задачи - не выполняйте одну рабочую работу над одной задачей, а затем завершите поток. Вместо этого создайте 5 потоков и позвольте им получить задания из общей очереди. Пусть каждый из них перебирается до тех пор, пока они не получат дозорный сигнал из очереди, которая говорит им прекратить работу.

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

import logging 
import Queue 
import threading 
logger = logging.getLogger(__name__) 
N = 100 
sentinel = object() 

def worker(jobs): 
    name = threading.current_thread().name 
    for task in iter(jobs.get, sentinel): 
     logger.info(task) 
    logger.info('Done') 


def main(): 
    logging.basicConfig(level=logging.DEBUG, 
          format='[%(asctime)s %(threadName)s] %(message)s', 
          datefmt='%H:%M:%S') 

    jobs = Queue.Queue() 
    # put tasks in the jobs Queue 
    for task in range(N): 
     jobs.put(task) 

    threads = [threading.Thread(target=worker, args=(jobs,)) 
       for thread_number in range (5)] 
    for t in threads: 
     t.start() 
     jobs.put(sentinel)  # Send a sentinel to terminate worker 
    for t in threads: 
     t.join() 

if __name__ == '__main__': 
    main() 
+0

Спасибо за объяснение. Я пытаюсь использовать это в моем случае. Улучшит работу. – Antonio

-1

Поместите свой код в цикле

end_of_list=True 
while end_of_list: 
     for thread_number in range (5): 
      if #condition for end of list: 
        end_of_list=False 
        break 
      thread = Th(thread_number) 
      thread.start() 
+0

Это будет выполняться в одно и то же время ... – Antonio

+0

@ Антонио: Будет ли это? Я думал, что это создаст 5 потоков в цикле цикла –

2

Кажется, что вы хотите, пул потоков. Если вы используете python 3, вам повезло: есть ThreadPoolExecutor class

Else, from this SO question, вы можете найти различные решения, будь то ручной или скрытые модули из библиотеки python.

+0

Спасибо! У этого вопроса есть много полезных ответов! – Antonio