1. 程式人生 > >python執行緒池(threadpool)模組使用筆記

python執行緒池(threadpool)模組使用筆記

https://www.cnblogs.com/xiaozi/p/6182990.html

 

一、安裝與簡介

pip install threadpool   

pool = ThreadPool(poolsize)  
requests = makeRequests(some_callable, list_of_args, callback)  
[pool.putRequest(req) for req in requests]  
pool.wait()  

第一行定義了一個執行緒池,表示最多可以建立poolsize這麼多執行緒;

第二行是呼叫makeRequests建立了要開啟多執行緒的函式,以及函式相關引數和回撥函式,其中回撥函式可以不寫,default是無,也就是說makeRequests只需要2個引數就可以執行;

第三行用法比較奇怪,是將所有要執行多執行緒的請求扔進執行緒池,[pool.putRequest(req) for req in requests]等同於

  for req in requests:  

     pool.putRequest(req) 

第四行是等待所有的執行緒完成工作後退出。

 

二、程式碼例項

複製程式碼

import time
def sayhello(str):
    print "Hello ",str
    time.sleep(2)

name_list =['xiaozi','aa','bb','cc']
start_time = time.time()
for i in range(len(name_list)):
    sayhello(name_list[i])
print '%d second'% (time.time()-start_time)

複製程式碼

改用執行緒池程式碼,花費時間更少,更效率

複製程式碼

import time
import threadpool  
def sayhello(str):
    print "Hello ",str
    time.sleep(2)

name_list =['xiaozi','aa','bb','cc']
start_time = time.time()
pool = threadpool.ThreadPool(10) 
requests = threadpool.makeRequests(sayhello, name_list) 
[pool.putRequest(req) for req in requests] 
pool.wait() 
print '%d second'% (time.time()-start_time)

複製程式碼

 

 當函式有多個引數的情況,函式呼叫時第一個解包list,第二個解包dict,所以可以這樣:

複製程式碼

def hello(m, n, o):
    """"""
    print "m = %s, n = %s, o = %s"%(m, n, o)
     
 
if __name__ == '__main__':
     
   # 方法1  
    lst_vars_1 = ['1', '2', '3']
    lst_vars_2 = ['4', '5', '6']
    func_var = [(lst_vars_1, None), (lst_vars_2, None)]
    # 方法2
    dict_vars_1 = {'m':'1', 'n':'2', 'o':'3'}
    dict_vars_2 = {'m':'4', 'n':'5', 'o':'6'}
    func_var = [(None, dict_vars_1), (None, dict_vars_2)]    
     
    pool = threadpool.ThreadPool(2)
    requests = threadpool.makeRequests(hello, func_var)
    [pool.putRequest(req) for req in requests]
    pool.wait()        

複製程式碼

 需要把所傳入的引數進行轉換,然後帶人執行緒池。

複製程式碼

def getuserdic():
    username_list=['xiaozi','administrator']
    password_list=['root','','abc123!','123456','password','root']
    userlist = []
    
    for username in username_list:
        
        user =username.rstrip()
        for password in password_list:
            pwd = password.rstrip()
            userdic ={}
            userdic['user']=user
            userdic['pwd'] = pwd
            tmp=(None,userdic)
            userlist.append(tmp)
    return userlist

複製程式碼

 最後

歡迎關注個人微信公眾號:Bypass--,每週原創一篇技術乾貨。