前回の記事では、我々のような、Pythonのスレッド関連の知識について多くを導入している スレッドのミューテックスをロック / イベントのスレッドのイベント / スレッド条件変数条件 などが、今日はそれにあなたを与える スレッドプールのThreadPoolExecutor、ずっと小さくてもよいですパートナーは、モジュールがスレッドを作成することができますスレッド、不思議でしょう、ThreadPoolExecutorは、スレッドを作成し、両方のそれはどのような違いを作るんですか?
我々はすべて知っているように、プログラムスレッドは、コンピュータの最小単位であるが、スレッドの利用効率が向上しますが、同じスレッドを作成し、使用するためには、コンピュータ資源と農産物のオーバーヘッドを占有しますコンピュータがクラッシュしますと、数十スレッド生成の何千もの後、!リソースボスのように、常に少なくともお金が欲しい、ほとんどの物事の消費を最小限に抑えた、常に合理的なプログラムは、人々の最小、ほとんどの事をやってを募集します!
A.原則スレッドプール
我々は、すべての同時ダウンロード数はわずか8を開いたVIPた場合でも、サンダーのダウンロード、ダウンロードと同時に、タスクをより頻繁に1000を使用していました。あなたは1000個のスレッドを作成する場合は、最初のオーバーヘッド電卓も素晴らしいですが、唯一の8スレッドそれぞれの実行、あなたは常に作成および破棄する必要があり、それは非常に面倒になります。
スレッドプールThreadPoolExecutorは、上記問題を解決することができ、実際には、ライン上にのみ8つのスレッド、スレッドがタスクを終了したときにタスクを割り当て、各スレッド毎に、残りのタスクがキューイングされ、タスクがキューに入れることができますこのスレッドを継続する取り決め、スレッドプールThreadPoolExecutor原理と呼ばれています!
II。ThreadPoolExecutorスレッドプールの機能紹介
1. ThreadPoolExecutorの通過構成例max_workersのパラメータは、スレッドプールで同時に実行できるスレッドの最大数を設定します。
2.使用して提出し、実行するスレッドプールのスレッドにタスク(関数名やパラメータ)を提出する機能を、そして(ファイルと同様に、描画)タスクハンドルを返し、ノート(提出)の代わりにブロックするが、すぐに戻りました。
3. 提出タスクハンドルは、関数によって返され、使用ができ行なわ()タスクを決定する方法は終了します。次の例では、タスク2Sため遅延がある、見ることができ、裁判官は、直ちに提出TASK1た後、タスク1は完了していない、と遅延4S判断した後、タスク1は完了です。
4. キャンセル()メソッドは、タスクがスレッドプールで実行されている場合は、キャンセルすることはできません、送信されたジョブをキャンセルすることができます。この場合、スレッドプールのサイズが2に設定され、タスクがすでに実行されているので、失敗キャンセル。あなたがスレッドプールのサイズを変更した場合、これは我々が正常にキャンセルできる時間で、その後、最初の提出はタスク2がまだ並んで待って、タスク1で、1です。
5.の結果()メソッドは、タスクの戻り値を取得します。注:このメソッドはブロックされます。
III。使用糸プールにThreadPoolExecutorのシンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#!USR / binに/ envをパイソン # - * - コーディング:UTF-8 _ * - 「」」 @author:なぜ悲しみ @Blog(個人ブログのアドレス):shuopython.com @WeChat Official Account(微信公众号):猿说python @Github:www.github.com
@File:python_threadpool.py @Time:2019/11/29 1queue5:25
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! """
from concurrent.futures import ThreadPoolExecutor import time
# 参数times用来模拟下载的时间 def down_video(times): time.sleep(times) print("down video {}s finished".format(times)) return times
executor = ThreadPoolExecutor(max_workers=2) # 通过submit函数提交执行的函数到线程池中,submit函数立即返回,不阻塞 task1 = executor.submit(down_video, (3)) task2 = executor.submit(down_video, (2)) # done方法用于判定某个任务是否完成 print("任务1是否已经完成:",task1.done()) # cancel方法用于取消某个任务,该任务没有放入线程池中才能取消成功 print("取消任务2:",task2.cancel()) time.sleep(4) print("任务1是否已经完成:",task1.done()) # result方法可以获取task的执行结果 プリント(TASK1 。結果()) |
出力:
1 2 3 4 5 6 |
タスク1が完了している:偽 タスクキャンセル2:偽 ダウンビデオ2S 終了 ダウンビデオ3S 終了 タスク1が完了している:真 3 |
スレッドプールは、スペースの制限により、はるかにそれよりも使用し、スレッドプールにas_completed /マップ/ウェイト機能を、我々は次の記事に残して紹介していき~~~
ブロックすると、スレッド・プールに関連するプレゼンテーションの実行順序については、を参照してください: PythonのスレッドプールThreadPoolExecutor(下)
あなたも好きなことがあります。
3.pythonのスレッドキューの優先度キューPriorityQueue-
指定してください再現:猿は、Python言う » (上)PythonのスレッドプールThreadPoolExecutorを