プロセスプール/スレッドプール
オープンプロセスオープンスレッドがリソースを消費する必要がありますが、比較的小規模な資源消費の場合、二つのスレッド
だから我々は、コンピュータの範囲内で余裕がコンピュータを最大限に活用できるようにする必要があります
プール:
コンピュータのハードウェアコンピュータのリソースを最大限に活用確保するための安全な条件の下で
プールは、実際にプログラムの効率江都ですが、コンピュータYongjianのセキュリティを確保するために、
concurrent.futures模块
プール= プロセスプール括弧内ProcessPoolExecutor()はプロセスの数を指定するパラメータを渡すことができ、デフォルトのCPUの数
プール括弧内= ThreadPoolExecutor()スレッドプールは、スレッドの数、デフォルトのCPU * 5のGeを指定するパラメータを渡すことができ
プロセス/スレッドで作成された池一度作成作成されません、最初から最後までは、このように繰り返しオープンプロセス/スレッドのリソースを節約する、いくつかのこれらの初期のデフォルトまたはカスタムで使用されています
提出するスレッド/プロセス内で非同期タスクを提出するpool.submit(FN、* argsを、** kwargsから)
concurrent.futures インポートProcessPoolExecutor、ThreadPoolExecutor インポートOS インポート時 #のインスタンス化プロセスプール プールProcessPoolExecutor =() #のプールを指定するパラメータを渡すことができ、括弧内の数、CPUのデフォルトプロセスプールの番号 #は、スレッドプールインスタンス化 #プール= ThreadPoolExecutor() DEF タスク(N): プリント(' %のS実行'%のN-、os.getpid()) (time.sleep。3 ) プリント(' %を超えるS '%のN-) リターン N-2 ** IF __name__ == 「__main__ 」: pool.submit(タスクは、 1) #は、非同期プロセスプール/スレッドプールの提出にジョブを送信 印刷(「主要プロセス/スレッド」)
結果()場所の待ちタスクは、結果を返します
#のインスタンス化プロセスプール #プールProcessPoolExecutor =() #インスタンス化スレッドプール プールThreadPoolExecutor =(5。 ) DEF タスク(N): プリント(' %のS実行'%のN-、os.getpid()) time.sleep( 3 ) #の印刷(N-%)は'%を超えるS' リターンのn-2 ** IF __name__ == ' __main__ ' : について私の中でできる範囲(3 ): RES = pool.submit(タスク、I) を印刷(" >>>:'、res.result()) #のインサイチュ待機タスクは、結果(リターン結果を返す) >>> 0ランニング 3664 >>> :0 。1 3664ランニング >>> :. 1 2走行3664 >>> :4
pool.shutdown()プール内のすべてのタスクを実行するために待っている、プールを閉鎖するが完了した後、私は、コードの下に行かなければなりません
プールは= ThreadPoolExecutor(5 ) デフタスク(N): 印刷(' %sの実行'%N、os.getpid()) time.sleep( 3 ) #1 プリント( '%sを超える' %n)が リターン N ** 2 なら__name__ == ' __main__ ' : リスト = [] のための I における範囲(3 ): RES = pool.submit(タスク、I) #异步提交任务 lists.append(RES) pool.shutdown() # 閉じる池、プールタスク実行のすべてを待つが完了した後、得られ、次のコード取るされる ために P でリストを: 印刷(「>>>:」、p.result()) >>> 0を実行している 12168を 。1 12168実行している 2 12168ランニングを > >> :0 >>>:1 >>>:4
add_done_callback(FUNC)コールバック関数
#のインスタンス化プロセスプール #プールProcessPoolExecutor =() #インスタンス化スレッドプール プールThreadPoolExecutor =(5。 ) DEF タスク(N): プリント(' %のS実行'%のN-、os.getpid()) time.sleep( 3 ) #の印刷( '%のオーバーS'のn%) のリターンのn-2 ** DEFのcall_back(N-): 印刷(' 非同期提出するタスクは結果を返します:' 、n.result())IF __name__ == ' __main__ ' : のための私 レンジ(10 ): RES = pool.submit(タスク、I).add_done_callback(call_back) #タスクを提出する際に、タスクの結果が即座に対応するコールバック関数を実行した後、コールバック関数を結合する >>> 0ランニング 8488 。1走行8488 2走行8488 。3走行が8488 。8488個の4ランニング 非同期タスクを提出し、その結果を返す:0 。5つのランニング8488の 戻る結果をタスク非同期送信:。1 。6ランニング8488 :戻る非同期タスクの結果を提出する。4 。8488 7走行 非同期タスクが送信されます戻り値:。9 。8 8488実行中の 非同期タスクは結果を返し提出: 16 。9 8488実行中の 非同期タスクを送信結果を返す: 36の 提出非同期タスクの結果を返す: 25 :非同期タスクを返します結果提出 64 リターンの非同期タスクの提出: 49 リターンの非同期タスク提出結果: 81
コルーチン
プロセス:リソース単位の スレッド:実行ユニットの コルーチン:シングルスレッドの同時実行を達成するために 並行処理をします。Switch + 状態セーブ CPUがタスクを実行しているが、それは両方のケースで他のタスクを実行するために離れて(オペレーティングシステムと力制御スイッチ)を切断かかります 1 のことを。ミッションは、障害物と会った 2時間を計算するタスクが長すぎます
コルーチンは、効率性を高め、お使いのオペレーティングシステムは、このスレッドのいずれかを持っていないという印象を与えるために、実行するために別のタスクにブロックされたIOスイッチに遭遇したユーザー自身のタスクによって制御コードを、シングルスレッドの性質でありますIO(ただし、前後に切り替える)、プログラムが準備完了状態で実行を確実にするように前後に切り替える。
それを達成するために、我々は、切り替える前に保存された状態を満たすと同時に、複数のタスクの鳥のリングを制御するソリューション方法を見つける必要があります。
geventモジュール
GEVENT インポート産卵 から GEVENT インポートモンキー; monkey.patch_all() インポート時間 「」「 GEVENTモジュールはIOのようtime.sleepされません )(手動monkey.patch_allを設定する必要がある 」「」 DEF ヘン(名): 印刷(" S%'%名、' まあ' ) time.sleep( 2 ) 印刷(' %S '%名、' まあ' ) DEF HA(名): 印刷(' %S'%名、' HA ' ) time.sleep( 3 ) 印刷(' %S '%名は、' HA 」) スタート = time.time() #は1つの執行機能のパラメータを起動コルーチンオブジェクトを作成し、パラメータは、2つのパラメータ必要の関数であり 、G1 =スポーン(ヘン、' X ' ) G2 =スポーン(HA、' Y ' ) g1.join() #は、実行のG1端待つ g2.join()を プリント)((time.time -スタート)