Отделите идею рабочего потока и задачи - не выполняйте одну рабочую работу над одной задачей, а затем завершите поток. Вместо этого создайте 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()
Спасибо за объяснение. Я пытаюсь использовать это в моем случае. Улучшит работу. – Antonio