我在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)
)来限制最大线程数。我的问题如下:
提前致谢!
卢卡斯
答案 0 :(得分:1)
您可以使用concurrent.futures.ThreadPoolExecutor
或multiprocessing.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是池中线程的数量。