[解決済み】Python 3におけるConcurrent.futuresとマルチプロセシングの比較
質問
Python 3.2導入 コンカレントフューチャーズ これは、旧来のスレッド機能と マルチプロセシング モジュールがあります。
CPUに拘束されるタスクにこれを使用する場合、旧来のマルチプロセッシングモジュールと比較して、どのような利点と欠点がありますか?
この記事 は、より使いやすくなっていると思いますが、そうでしょうか?
どのように解決するのですか?
を呼び出すことはありません。
concurrent.futures
より高度なものです。
よりシンプルに
このインターフェースは、並列化の基本的なギミックとしてマルチスレッドとマルチプロセスのどちらを使用しても、ほとんど同じように動作します。
つまり、「よりシンプルなインターフェイス」のほぼすべての例と同じように、トレードオフが関係しているのです:学習曲線が浅く、その理由の大部分は、利用できるものが非常に少ないことです。 への しかし、選択肢が少ないため、リッチなインターフェースにはないフラストレーションを感じるかもしれません。
CPU拘束のタスクに関しては、あまりに仕様が不十分で、あまり意味のあることは言えません。 CPython の CPU バインドタスクでは、高速化のチャンスを得るには、複数のスレッドではなく、複数のプロセスが必要です。 しかし、どの程度の速度向上が得られるかは、ハードウェアやOSの詳細、特に特定のタスクがどの程度のプロセス間通信を必要とするかに依存します。 プロセス間並列化の仕組みはすべてOSのプリミティブに依存しており、それを利用するための高レベルのAPIは、最終的な速度の主要な要因ではありません。
編集:例
参照した記事で紹介されている最終的なコードですが、動作させるために必要なimport文を追加しています。
from concurrent.futures import ProcessPoolExecutor
def pool_factorizer_map(nums, nprocs):
# Let the executor divide the work among processes by using 'map'.
with ProcessPoolExecutor(max_workers=nprocs) as executor:
return {num:factors for num, factors in
zip(nums,
executor.map(factorize_naive, nums))}
以下は、まったく同じことを
multiprocessing
の代わりに
import multiprocessing as mp
def mp_factorizer_map(nums, nprocs):
with mp.Pool(nprocs) as pool:
return {num:factors for num, factors in
zip(nums,
pool.map(factorize_naive, nums))}
を使用することができることに注意してください。
multiprocessing.Pool
オブジェクトをコンテキストマネージャとして使うことが Python 3.3 で追加されました。
どちらが作業しやすいかについては、基本的に同じです。
一つ違うのは
Pool
は、非常に多くの異なる方法をサポートしているので、それがいかに簡単であるかに気づかないかもしれません。
できる
を使いこなすには、かなり上達する必要があります。
繰り返しになりますが、こうしたさまざまな方法があることは強みであり弱みでもあります。 状況によっては柔軟性が求められるので、長所でもあります。 弱点は、quot;できれば1つの明白な方法しかないことです"。 可能であれば)以下の方法のみにこだわるプロジェクト。
concurrent.futures
は、その最小限のAPIをどのように使うかについて、無償の新規性がないため、おそらく長期的には保守しやすくなる。
関連
-
Pythonコンテナのための組み込み汎用関数操作
-
Pythonの画像ファイル処理用ライブラリ「Pillow」(グラフィックの詳細)
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
Pythonの@decoratorsについてまとめてみました。
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み】NameError: 名前 'self' が定義されていません。
-
[解決済み】 TypeError: += でサポートされていないオペランド型: 'int' および 'list' です。