プロセスは、リソースの集合です
スレッドには、内の特定のワークプロセスであります
スレッドとスレッド間の相互に独立しています
マルチスレッド:IO集約的なタスクについて
マルチプロセス:CPU集約型のタスクのための
まず、マルチスレッド
スレッドがthreadingモジュールを使用する必要があります
スレッド開始方法:
引数=(「XXX」、ように書くことにする唯一の1つのパラメータが存在する場合threading.Thread(対象= XXX、引数=(「XXX」、「xxxは」))関数の名前を取る#target、引数のパラメータは、その後、渡されます)
スレッドのうちの子スレッドですthreading.Threadの例では、一つのスレッドだけまずアップがメインスレッドです
シンプルなマルチスレッドを書きます
スレッドインポート DEFのdown_load(): time.sleep(1 ) プリント(' オーバー実行' ) 用の I におけるレンジ(5 ):#5サイクル、すなわち、5つのスタートスレッド T threading.Threadの=(目標= down_load)例#スレッドの t.start()#スレッド開始 プリント(threading.active_count())#表示現在の行プロセスの数 印刷(threading.current_thread())#表示現在のスレッドを
私は今待つスレッドを伴う、取引の実行を開始参加するために、スレッドが待っている、使用jionは多くの問題になり、すべてのスレッドを見たい場合は、ハンドルにwhileループ方式を使用することができます。
スレッディングインポート インポート時間 DEFのdown_load(): (time.sleep 。1 ) (印刷' 轢か' ) START_TIME = time.time() のための I におけるレンジ(5 ):#5サイクル、すなわち、5つのスタートスレッド T =スレッディング.thread(ターゲット= down_load)#インスタンス化スレッド t.start()#開始スレッド 間 threading.active_count()!= 1 :、#1スレッドの数に等しくされていないがサイクルとなっている分析サイクルの終了まで、1に等しい パス を印刷(threading.active_countは())#は、スレッドの現在の数を表示し 、印刷(threading.current_thread())#現在のスレッドのチェック END_TIMEを = time.time() (印刷"時間:"、END_TIME-START_TIME)
例:
それぞれシングルおよびマルチスレッド実行と画像をダウンロードするための時間を見て2つの方法があります。
mport要求、時間、スレッド から hashlibのインポートMD5 DEF :down_load_pic(URL) REQ = requests.get(URL) 、M = MD5(url.encode()) オープン(m.hexdigest()と + ' の.png '、' WB ' )FWとして: fw.write(req.content) url_list = [ ' http://www.nnzhp.cn/wp-content/uploads/2019/10/f410afea8b23fa401505a1449a41a133.png ' ' HTTP://www.nnzhp .CN / WP-コンテンツ/アップロード/ 11分の2019 / 481b5135e75c764b32b224c5650a8df5.png "、 ' Http://www.nnzhp.cn/wp-content/uploads/2019/11/b23755cdea210cfec903333c5cce6895.png ' 、 " http://www.nnzhp.cn/wp-content/uploads/2019/11/542824dde1dbd29ec61ad5ea867ef245。 PNG " ] #シリアル・ダウンロード・オペレーション(シングルスレッド) #START_TIME time.time =() #URL_LISTでのURLのために: # down_load_pic(URL) #のEND_TIME time.time =() #の #の印刷(END_TIME-START_TIME) #1 パラレル方法(マルチスレッド) START_TIME = time.time() のための URL でURL_LIST: Tthreading.Thread =(対象= down_load_pic、引数=(URL)) #そう書かれる唯一つのパラメータ(URL) t.start() しばらく threading.activeCount()= 1! : パス END_TIME = time.time() 印刷(END_TIME-START_TIME)
- スレッドプール
ピップは、スレッドプールをインストールします、それを手動でインストールする必要がスレッドプールスレッドプールのモジュールを使用する必要があります
スレッドプールは、自動的にデータの分布を計算することができ、我々は手動で起動する必要はありません、または一例として、画像をダウンロードするには:
インポートスレッドプール インポート要求、時間、スレッド から hashlibのインポートMD5 DEF down_load_pic(URL): REQ = requests.get(URL) 、M = MD5(url.encode()) オープンと(m.hexdigest() + ' .PNG '、' WB ' FWとして): fw.write(req.content) url_list = [ ' http://www.nnzhp.cn/wp-content/uploads/2019/10/f410afea8b23fa401505a1449a41a133.png ' 、 'http://www.nnzhp.cn/wp-content/uploads/2019/11/481b5135e75c764b32b224c5650a8df5.png ' ' http://www.nnzhp.cn/wp-content/uploads/2019/11/b23755cdea210cfec903333c5cce6895.png " 、 ' http://www.nnzhp.cn/wp-content/uploads/2019/11/542824dde1dbd29ec61ad5ea867ef245.png ' ] プール = threadpool.ThreadPool(20)と#スレッドプールインスタンス REQSを= threadpool.makeRequests(down_load_pic、url_list )#の割り当てデータを、最初は、関数名、第二のデータである ##コードの次の2行で、式をリスト[REQSにREQためpool.putRequest(REQ)] のため REQ で:REQS pool.putRequest(REQ ) pool.wait() # 彼らは完成し、印刷が実行された端部を有するまで、エンド・印刷するために待機するしない場合、待って 印刷を(「終了」)
- デーモンスレッド
デーモンスレッドはメインスレッドに依存して、メインスレッドが終了すると、デーモンスレッドがすぐに終了します。
インポートスレッディング、タイム DEFのdown_load(): time.sleep( 1。 ) 印刷(' 轢か' ) のために I でレンジ(5。 ): T = threading.Threadの(対象= down_load) t.setDaemon(真)#のセット子スレッドデーモンスレッド t.start() 印刷(「オーバー」)
- スレッドロック
同じ時間のデータを操作する複数のスレッドは、我々はロックする必要があります、
インポートスレッディング NUM = 0 ロック = threading.Lock() #はロック適用 DEF 追加を(): 株式会社フリーは参加NUMの #lock.acquire()#ロック #NUM + = 1 #ロックされていない場合lock.release()#アンロックをロック解除後にデッドロックしません :ロックで#1 、速記を自動ロックでのお手伝いをします、ロック解除 NUM + = 1
のための I におけるレンジ(10 ): T = threading.Thread(ターゲット= 追加) t.start( ) しばらく threading.activeCount()= 1。! : パス 印刷(' オーバー:'、A)
第二に、マルチプロセス
モジュールマルチプロセッシング処理用途
インポートは、マルチプロセッシング、時間 DEFは)(down_load: time.sleepは、( 1 ) 印刷(「轢か」) のIF __name__ == 「__main__ 」:#窓の下には、それ以外の場合はエラーになり、メインで複数のプロセスを記述する必要が、Macは必要としない ために私中範囲(5 :) のp- = multiprocessing.Process(ターゲット= down_load) #のプロセスの一例 p.start() しながら、 lenは(multiprocessing.active_children())!= 0: パス 印刷(multiprocessing.current_process()) #現在のプロセスに見る #のCPU#ビューの数を印刷(multiprocessing.cpu_countを()) を印刷(「終了」)