
234
|
第九章
如果你正在從事長時間執行的科學問題,在當中,每個任務都要耗費很多
秒鐘的時間(甚至更長),那麼,你可能會想要檢視一下 Gael Varoquaux
的
joblib
(
http://pythonhosted.org/joblib/
)。這項工具支援輕量級的管道機
制(pipelining);奠基於
multiprocessing
之上,並且提供比較簡單的平
行化介面、結果快取,以及偵錯功能。
工作佇列
multiprocessing.Queue
物件提供我們非永續性的佇列(nonpersistent queue),那能夠在
行程之間傳送任何可序列化的(pickleable)Python 物件。佇列附帶額外成本,因為每
個物件都必須經過序列化(pickle)才能夠被傳送,然後在消費者當中被反序列化(伴
隨著一些鎖定操作)。在下列範例裡,我們會看到這項成本不可被忽略。然而,如果你
的工作者正在處理較大型的任務,那麼,額外的溝通成本或許可以被接受。
使用這些佇列相當容易。在這個範例裡,我們會檢查一序列候選數字,並且將找到的質
數放回
definite_primes_queue
。我們會使用 1、2、4 和 8 個行程來執行這項工作,並且
確認後面二個所花費的時間會比執行單一行程(檢查相同的數字範圍)都還要長。
Queue
讓我們能夠使用原生的 Python 物件執行大量的行程間通訊,如果你正四處傳遞具
有許多狀態的物件,這會是很有用的。不過,因為
Queue
缺乏永續性(persistence), 你
可能不想要將它們運用於必須在發生失敗時維持強健性( ...