[英]Python queues - have at most n threads running
场景:
我有一个非常大的数据库模型迁移正在进行新的构建,我正在研究如何将Web应用程序中的当前实时数据迁移到本地测试数据库中。
我想在python中设置一个脚本,它将同时处理我的模型的迁移。 我的模型实例有from_legacy
和to_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.