限制python中的线程数量

时间:2015-03-10 15:21:18

标签: python multithreading csv queue

我在python中有一个脚本,它触发几个并行的telnet连接到不同的路由器来做某事。它工作得很好。路由器列表在CSV文件中传递给python。

另一方面,为了触发并行telnet连接,我使用线程。这是我的代码的开始:

oFile = csv.reader(open(FileCsv,"r"), delimiter=",", quotechar="|")
routers = list(oFile)
[. . .]
for i in range(len(routers)):

    # We generate the config file
    ip = routers[i][0]
    CliLine=write_cliLine(routers[i])

    # running routine
    t = MiThread(i,CliLine,ip)
    # wait random number of seconds between threads (0sec to 5sec)
    time.sleep(random.randint(0,5))
    t.start()

今天,线程数量由CSV文件(for i in range(len(routers)))内的行数给出。我知道我可以通过限制for循环(for i in range(10))来限制最大线程数。我的问题如下:

  • 假设我将线程数量限制为10并且我的CSV文件中有15行,那么前10行将确保提供。如何暂停其他5个,如果前10个路由器 - 线程中的任何一个完成,我怎样才能在以后提供这5行?

提前致谢!

卢卡斯

1 个答案:

答案 0 :(得分:1)

您可以使用concurrent.futures.ThreadPoolExecutormultiprocessing.pool.ThreadPool。如果不知道MiThread正在做什么就很难告诉你如何实现它,但基本的想法是这样的(使用multiprocessing.pool.ThreadPool):

def run_mi_thread(i, CliLine, ip):
    # Do whatever MiThread.run does.


oFile = csv.reader(open(FileCsv,"r"), delimiter=",", quotechar="|")
routers = list(oFile)
[. . .]
p = ThreadPool(5) # 5 threads
for i, router in enumerate(routers):
    # We generate the config file
    ip = router[0]
    CliLine= write_cliLine(router)
    p.apply_async(run_mi_thread, args=(i, CliLine, ip))
p.close()
p.join()

使用此功能,最多可以运行五个并发操作。所有其他请求将由ThreadPool在内部排队,并且随着池中的线程完成任务,将逐个弹出队列。

请注意,我删除了启动线程之间的延迟。您可以根据需要添加它,但只能保证在前N个任务中正常工作,其中N是池中线程的数量。