繁体   English   中英

Python队列 - 最多运行n个线程

[英]Python queues - have at most n threads running

场景:

我有一个非常大的数据库模型迁移正在进行新的构建,我正在研究如何将Web应用程序中的当前实时数据迁移到本地测试数据库中。

我想在python中设置一个脚本,它将同时处理我的模型的迁移。 我的模型实例有from_legacyto_legacy方法。 到目前为止,我加载了所有实例并为每个实例创建了threads ,每个线程都从核心threading模块子类threading并使用run方法进行转换并保存结果。

我想让程序中的主循环构建这些线程的一大堆实例,并开始逐个处理它们,在它工作时同时运行最多10个,然后将下一个进行处理当其他人完成迁移时处理。

我无法弄清楚如何正确利用队列来做到这一点? 如果每个线程代表完整的迁移任务,我应该先加载所有实例,然后创建一个maxsize设置为10的Queue ,并且只跟踪当前正在运行的队列吗? 也许这样的事情?

currently_running = Queue()
for model in models:
  task = Migrate(models) #this is subclassed thread
  currently_running.put(task)
  task.start()

在这种情况下,依赖于put调用阻塞它的容量? 如果我要走这条路,我怎么称呼task_done

或者更确切地说,如果Queue包含所有任务(不仅仅是已启动的任务)并使用join来阻止完成? 在线程队列上调用join是否会启动包含的线程?

什么是最好的方法来处理“最多有N个运行线程”问题以及Queue应该扮演什么角色?

虽然没有记录 ,但multiprocessing模块有一个ThreadPool类,顾名思义,它创建一个线程池。 与multiprocessing.Pool类共享相同的API

然后,您可以使用pool.apply_async将任务发送到线程池:

import multiprocessing.pool as mpool

def worker(task):
    # work on task
    print(task)     # substitute your migration code here.

# create a pool of 10 threads
pool = mpool.ThreadPool(10)
N = 100

for task in range(N):
    pool.apply_async(worker, args = (task, ))

pool.close()
pool.join()

这可能应该使用信号量完成, 文档中的示例是您尝试完成的一些提示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM