gpt4 book ai didi

python - 限制python中的线程数量

转载 作者:太空宇宙 更新时间:2023-11-03 17:52:05 29 4
gpt4 key购买 nike

我有一个 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 行提供服务?

提前致谢!

卢卡斯

最佳答案

您可以使用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 是池中的线程数。

关于python - 限制python中的线程数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28967541/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com