如何限制线程数量

时间:2016-04-30 06:50:55

标签: python multithreading

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)

1 个答案:

答案 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