1. 程式人生 > >python程序池Pool的apply與apply_async到底怎麼用?

python程序池Pool的apply與apply_async到底怎麼用?

背景

最近在解決問題的時候遇到了上下文衝突的問題,不得不用多程序來解決這個問題。這個問題是StackOverflow沒有完整答案的問題,下一篇部落格進行介紹。

多程序

python中使用multiprocessing模組實現多程序。multiprocessing模組提供了一個Process類來代表一個程序物件,這個模組表示像執行緒一樣管理程序,是multiprocessing的核心,它與threading很相似,對多核CPU的利用率會比threading好的多。

Pool類

Pool類可以提供指定數量的程序供使用者呼叫,當有新的請求提交到Pool中時,如果池還沒有滿,就會建立一個新的程序來執行請求。如果池滿,請求就會告知先等待,直到池中有程序結束,才會建立新的程序來執行這些請求。

Signature: Pool(processes=None, initializer=None, initargs=(), maxtasksperchild=None)
Docstring: Returns a process pool object
File:      /usr/lib/python3.5/multiprocessing/context.py
Type:      method

Pool 中提供瞭如下幾個方法:

apply()
apply_async()
map()
map_async()
close()
terminal()
join()

這裡主要說一下apply和apply_async兩個,其他的內容可以進行百度搜索

apply
Signature: pool.apply(func, args=(), kwds={})
Docstring: Equivalent of `func(*args, **kwds)`.
File:      /usr/lib/python3.5/multiprocessing/pool.py
Type:      method

apply函式主要用於傳遞不定引數,主程序會被阻塞到函式執行結束。也就是說只有apply裡面的內容被執行完了,才會進行執行主函式的內容。
在這裡插入圖片描述

apply_async
Signature: pool.apply_async(func, args=(), kwds={}, callback=None, error_callback=None)
Docstring: Asynchronous version of `apply()` method.
File:      /usr/lib/python3.5/multiprocessing/pool.py
Type:      method

在這裡插入圖片描述