python 中的线程数量限制

Limit amount of threads in python

我在 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)) 来限制线程的最大数量。我的问题如下:

提前致谢!

卢卡斯

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