標籤:
經常用到threadpool這個庫,用起來很簡單:
pool = threadpool.ThreadPool(threadnum) reqs = threadpool.makeRequests(repeater.get_rq, args_list=arg_list, callback=result_handle_func) [pool.putRequest(req) for req in reqs] pool.wait() pool.dismissWorkers(threadnum)
如上,是最經典的調用方法,關鍵在第二句,在這裡我經常遇到問題,特別是參數的問題。如果是單個的參數,那麼很簡單,這裡的args_list只需要是個列表,裡面是所有參數即可。
但是情況不總是那麼簡單,比如,我的repeater.get_rq函數是這樣的:
@staticmethod def get_rq(*opt): ‘‘‘ :param opt: 字典包括了 url want ,前者是url,後者是body 或者header :return: ‘‘‘ opt = opt[0] if opt == {}: return "Not a Lucky day?ah?" url = opt["url"] want = opt["want"] cookies = None if ‘cookies‘ in opt.keys(): cookies = opt[‘cookies‘] url = urlinfo(url).url header = getrandomheader() if cookies: rq = requests.get(url, headers=header,cookies=cookies) else: rq = requests.get(url, headers=header) if want=="body": return rq.text else: return rq.headers
我希望這樣使用這個函數:
temp = { "url":"www.wooyun.org", "want":"body", } a = repeater.get_rq(temp)
看起來這裡用了個*很多餘,其實就是為了適配threadpool函數。
看threadpool代碼可以知道,如果你的參數不是元組,那麼會封裝為列表再傳參。此時,你的回呼函數接收到的參數為:
[你的參數],None
然後threadpool會這樣調用:
result = request.callable(*request.args, **request.kwds)
前一個就是你的參數。
[Python] threadpool1.2.7回呼函數的參數設定