限制Python线程、队列中的线程

限制Python线程、队列中的线程,python,Python,Im使用以下代码来处理多线程urlib2。但是,什么是限制它使用的线程数的最佳方法 class ApiMultiThreadHelper: def __init__(self,api_calls): self.q = Queue.Queue() self.api_datastore = {} self.api_calls = api_calls self.userpass = '#####' def query_

Im使用以下代码来处理多线程urlib2。但是,什么是限制它使用的线程数的最佳方法

class ApiMultiThreadHelper:

    def __init__(self,api_calls):
        self.q = Queue.Queue()
        self.api_datastore = {}
        self.api_calls = api_calls
        self.userpass = '#####'

    def query_api(self,q,api_query):
        self.q.put(self.issue_request(api_query))

    def issue_request(self,api_query):

        self.api_datastore.update({api_query:{}})

        for lookup in ["call1","call2"]:
            query = api_query+lookup

            request = urllib2.Request(query)
            request.add_header("Authorization", "Basic %s" % self.userpass)
            f = urllib2.urlopen(request)
            response = f.read()
            f.close()

            self.api_datastore[api_query].update({lookup:response})

        return True

    def go(self):
        threads = []
        for i in self.api_calls:
            t = threading.Thread(target=self.query_api, args = (self.q,i))
            t.start()
            threads.append(t)

        for t in threads:
            t.join()

您应该使用线程池。以下是我多年前的实现(Python 3.x友好):

您还可以在
multiprocessing.pool
模块中找到类似的类(不要问我它为什么存在)。然后,您可以像这样重构代码:

def go(self):
    tp = ThreadPool(20)  # <-- 20 thread workers
    for i in self.api_calls:
        tp.add_job(self.query_api, args=(self.q, i))
    tp.join()
    tp.deactivate()
def go(self):
tp=线程池(20)#
def go(self):
    tp = ThreadPool(20)  # <-- 20 thread workers
    for i in self.api_calls:
        tp.add_job(self.query_api, args=(self.q, i))
    tp.join()
    tp.deactivate()