执行线程5乘5

时间:2013-06-27 14:13:35

标签: python multithreading

我有大量的信息,我的程序应该分析每一个。为了加快我想要使用线程,但我想将它们限制为5.所以我需要创建一个包含5个线程的循环,当一个完成他们的工作时,抓住一个新的直到列表的末尾。 但我不知道如何做到这一点。我应该使用队列吗?现在我只用最简单的方式运行5个线程: 谢谢!

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

2 个答案:

答案 0 :(得分:2)

好像你想要一个线程池。如果您使用的是python 3,那么您很幸运:有一个ThreadPoolExecutor class

另外,从this SO question,您可以找到各种解决方案,手工制作或使用python库中的隐藏模块。

答案 1 :(得分: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()