限制Python线程、队列中的线程
Im使用以下代码来处理多线程urlib2。但是,什么是限制它使用的线程数的最佳方法限制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_
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()