1. 程式人生 > >python技巧——使用threadpool實現多執行緒並行

python技巧——使用threadpool實現多執行緒並行

可以使用 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實現多程序並行.