THINGS
变量中存储了101个内容。
代码声明101个线程并立即同时立即执行它们。
我想知道我们是否可以将活动线程的数量限制为12个。
首先只有12个线程应该选择12个要处理的东西。其余的线程应该等待前12个完成他们的工作。当前12个线程全部完成后,接下来的12个线程将接收下一个要处理的12个线程。一个人。
有可能吗?
import Queue
import threading, time
class MyThread(threading.Thread):
def __init__(self, theQueue=None):
threading.Thread.__init__(self)
self.theQueue=theQueue
def run(self):
thing=self.theQueue.get()
self.process(thing)
self.theQueue.task_done()
def process(self, thing):
time.sleep(1)
print 'processing %s'%thing.name
queue=Queue.Queue()
THINGS = ['Thing%02d'%i for i in range(101)]
THREADS=[]
for thing in THINGS:
thread=MyThread(theQueue=queue)
thread.name = thing
THREADS.append(thread)
thread.start()
for thread in THREADS:
queue.put(thread)
答案 0 :(得分:3)
工作解决方案发布在下方。 基本思想是我们只声明与可用CPU一样多的Threads实例。然后我们继续添加"任务" (或#34;事情"在这里)到队列。 一旦将任务添加到队列中,它就会被我们在上一步中声明的一个Thread实例立即拾取。
重要说明:为了使此机制起作用,MyThread.run()
方法应该在while
循环内运行。否则MyThread实例将在完成第一个任务后立即终止。在遗留队列中的任务后,while
循环将自行退出。这是故事的结尾。
import Queue
import threading, time
class MyThread(threading.Thread):
def __init__(self, theQueue=None):
threading.Thread.__init__(self)
self.theQueue=theQueue
def run(self):
while True:
thing=self.theQueue.get()
self.process(thing)
self.theQueue.task_done()
def process(self, thing):
time.sleep(1)
print 'processing %s'%thing
queue=Queue.Queue()
THINGS = ['Thing%02d'%i for i in range(101)]
AVAILABLE_CPUS=3
for OneOf in range(AVAILABLE_CPUS):
thread=MyThread(theQueue=queue)
thread.start() # thread started. But since there are no tasks in Queue yet it is just waiting.
for thing in THINGS:
queue.put(thing) # as soon as task in added here one of available Threads picks it up