python技巧——使用threadpool實現多執行緒並行
阿新 • • 發佈:2018-12-04
可以使用 threadpool
來實現多程序並行。
示例
我想用多執行緒求一個數列的和,可以如下操作:
import threadpool
def func(dic, c):
dic['count'] += c
if __name__=="__main__":
d = dict()
d['count'] = 0
l = [1, 2, 3]
pool = threadpool.ThreadPool(len(l)) # 成立執行緒池
params = [([d, x], None) for x in l] # 拼接 func 的引數
requests = threadpool.makeRequests(func, params) #
[pool.putRequest(req) for req in requests]
pool.wait()
print(f'dic={d}')
輸出:
dic={'count': 6}
函式
makeRequests()
函式原型:makeRequests(callable_, args_list, callback=None, exc_callback=_handle_thread_exception)
可以很方便地建立多個工作請求(呼叫函式相同、引數不同)。
其中,
callable_
為需要呼叫的函式名args_list
是一個 list,每一個元素包含了一次呼叫的所有引數。每個元素的格式二選一:
1、一個單一的、非元組的引數。
2、一個二維元組,存放著一個 list 和一個 dict,list 按照順序存放了函式的引數,dict 按照 key 存放了函式的引數。list 和 dict 有一個即可,另外一個可以為 None。
例子中 args_list
的值為
params = [([d, x], None) for x in l]
params
的元素就是一個二元元組,其中 dict 為 None,list 為二維陣列,按順序存放著 dic 和 c 的值。
也可以這樣寫:
params = [(None, {'dic':d, 'c':x}) for x in l]
params
的元素也是一個二元元組,其中 list 為 None,dict 按 key 存放著 dic 和 c 的值。
這兩種賦值的效果是等價的。
putRequest()
函式原型為 putRequest(self, request, block=True, timeout=None)
將工作請求放入到工作佇列中,並執行。
wait()
阻塞,直到執行緒池中所有的執行緒都結束。
記憶體共享
多執行緒之間是可以共享任何記憶體的,比如例子中的 dic 就被共享了,因此可以對其進行累加。
如果是多程序,則不可以共享記憶體,如果需要共享,需要其他的手段才可以,參照python技巧——使用Pool實現多程序並行.