我在列表中有一个大型数据集,我需要做一些工作。
我想在任何给定时间启动x个线程来处理列表,直到弹出该列表中的所有内容。
我知道如何在给定时间启动x个线程(比方说20个)(通过使用thread1 .... thread20.start())
但是当前20个线程中的一个完成时,如何让它启动新线程?所以在任何给定的时间都有20个线程在运行,直到列表为空。
到目前为止:
class queryData(threading.Thread):
def __init__(self,threadID):
threading.Thread.__init__(self)
self.threadID = threadID
def run(self):
global lst
#Get trade from list
trade = lst.pop()
tradeId=trade[0][1][:6]
print tradeId
thread1 = queryData(1)
thread1.start()
更新
我有以下代码:
for i in range(20):
threads.append(queryData(i))
for thread in threads:
thread.start()
while len(lst)>0:
for iter,thread in enumerate(threads):
thread.join()
lock.acquire()
threads[iter] = queryData(i)
threads[iter].start()
lock.release()
现在它在开始时启动20个线程......然后在一个完成后继续启动新线程。
然而,它效率不高,因为它等待列表中的第一个完成,然后是第二个......依此类推。
有更好的方法吗?
基本上我需要:
-Start 20 threads:
-While list is not empty:
-wait for 1 of the 20 threads to finish
-reuse or start a new thread
答案 0 :(得分:4)
正如我在评论中所建议的那样,我认为使用multiprocessing.pool.ThreadPool
是合适的 - 因为它会自动处理您在代码中手动执行的大部分线程管理。一旦所有线程排队等待通过ThreadPool
的{{1}}方法调用进行处理,唯一需要做的就是等到它们全部执行完毕(除非你的代码还有别的东西)当然可以做。)
我已将linked answer中的代码翻译成另一个相关问题,因此它更类似于您在当前上下文中更容易理解的内容。
apply_async()
答案 1 :(得分:1)
您可以等待线程完成:thread.join()
。此调用将阻塞,直到该线程完成,此时您可以创建一个新的。
但是,不是每次都重新生成一个线程,为什么不回收现有的线程呢?
这可以通过使用任务来完成。您在共享集合中保留任务列表,当其中一个线程完成任务时,它会从该集合中检索另一个任务。