最n个线程的情景:Python的队列 - 必须在运行
我有一个非常大的数据库模型迁移持续了一个新的版本,和我的工作boilerplating我们将如何去迁移电流的实时数据从webapp进入本地测试数据库。
我想在python中设置一个脚本,它将同时处理我的模型的迁移。我的模型实例有from_legacy
和to_legacy
方法。我到目前为止加载了所有实例,并为每个实例创建了threads
,每个线程从核心threading
模块中分类,并使用run
方法进行转换并保存结果。
我想让程序中的主循环构建一大堆这些线程的实例,并开始一个接一个地处理它们,并且最多只能同时运行10个工作,接下来在其他人完成迁移时进行处理。
我弄不清楚的是如何正确使用队列来做到这一点?如果每个线程都代表完整的迁移任务,我应该先加载所有实例,然后创建一个Queue
并将maxsize
设置为10,并且只跟踪当前正在运行的队列?也许这样的事情?
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个正在运行的线程”问题以及队列扮演什么角色的最佳方法是什么?
你不想那样做,因为当正在处理的作业,也不会在等待队列工作。你需要一个“在飞行中”工作的队列,这似乎很愚蠢。只需创建你想要的线程数。没有“包含线程”这样的事情,但只要每个线程在其作业完成之前都不会终止(包括等待任何线程成为其中的一部分),那么只需等待主线程即可。 –
因此,创建10个线程,它们自己被馈送到模型实例,而不是每个线程?如何在每次完成迁移后重新启动它们? – DeaconDesperado
不要重新启动它们。线程只是将队列从队列中拉出,直到队列为空。 –