定義をスレッド1
スレッドは、オペレーティングシステムのスケジューラの最小単位であります
それがプロセスに含まれている、装置の実際の動作が処理中です
プロセス自体は、CPUを動作させるために、自分自身を実行することができません、あなたがスレッドを作成する必要があり、スレッドは命令のセットです
回答内容に定義を拡張スレッド
1. Aスレッドは、システム運用スケジュールを操作することが可能な最小単位です。それがプロセスに含まれている、装置の実際の動作が処理中です
2.スレッドの異なるタスクを実行するために並列に各スレッド、プロセスが複数のスレッドによって複雑にすることができ、プロセスシーケンスの単一の制御フローを指し
3.ない事項は、あなたがCPUの数を持っているどのように多くの作業を開始するスレッド、Pythonは実行するために一つのスレッドのみを許可すると同時に、冷静の実装になります
4.プロセス自体は、CPUを動作させるために、自分自身を実行することができません、あなたがスレッドを作成する必要があり、スレッドは命令のセットです
同じプロセスを共有同じメモリ空間内5.すべてのスレッド、メモリ空間は、異なるプロセス間で異なります
6.同じプロセス同士がリソースにアクセスできる各スレッドは、スレッドは、同じプロセス内の他のスレッドを操作することができますが、プロセスは、子プロセスを動作させることができます
7. 2つのプロセスがなければなりません中間プロキシを介して、伝えたいです
8.そう修飾のメインスレッドに他のサブスレッドバックに影響を与えるために、変化が一次プロセスのプロセス間メモリ独立等の他のプロセスに影響を与えないが、スレッド共有メモリ同じプロセス下
2. プロセスおよびスレッドとの間の差
図1に示すように、プロセスは、スレッドを含みます
2、スレッド共有メモリ空間
図3に示すように、プロセスメモリは(互いに接近しない)独立しています
図4に示すように、プロセスは、子プロセスを生成してもよい、互いにCAN間の子プロセスは(クローンは親プロセス内の2つのサブプロセスに対応する)相互にアクセスしません
5、その間スレッドは、プロセスを交換することができます。2つのプロセスは、中間プロキシを介して達成されなければならない、伝えたいです
6、新しいスレッドを作成すると、親プロセスをクローン化するために、新しいプロセスのニーズを作成するだけです。
図7に示すように、スレッドは、同じプロセス内の他のスレッドを制御または操作することができます。しかし、このプロセスは唯一の子を操作することができます。
8、親プロセスは子に影響を与えずに変更することができますが、変更することはできません。
9、スレッドが同時にアプリケーションがいくつかのことを行うことができます
3. 複数のスレッドを開始するサイクル
インポートのスレッド
インポート時
デフsayhi(NUM):各スレッドを実行する#-defined機能
印刷( "番号で実行されている:%s" の%の数値)
time.sleep(3)
iの範囲内(50):
T = threading.Thread(目標= sayhi、引数=( 'T-%S' %I))
t.start()
T.join 4.() :すべてのスレッドの履行は、メインスレッドの実行を終了するために実行された後
インポートのスレッド
インポート時
START_TIME = time.time()
デフsayhi(NUM):各スレッドを実行する#-defined機能
印刷( "番号で実行されている:%s" の%の数値)
time.sleep(3)
t_objs = []#プロセスインスタンスオブジェクトがこのリストに格納されています
iの範囲内(50):
T = threading.Thread(目標= sayhi、引数=( 'T-%S' %I))
t.start()#は、スレッドを開始すると、プログラムはブロックしません
t_objs.append(T)
プリント(threading.active_count())#は、現在アクティブなプロセスの数を印刷します
すべての上に50個のプロセス上で使用するために#待機ループ:t_objsでトンのために
プログラムをブロックt.join()#
このコマンドは、印刷(threading.current_thread())#の印刷実行処理
(「----------------すべてのスレッドが終了した.....」)を印刷
印刷(threading.active_count())
印刷( 'コスト時間:'、time.time() - START_TIME)
5.は、setdaemon():デーモンスレッド、メインスレッドが終了、子スレッドとメインスレッドを終了する必要が
インポートのスレッド
インポート時
START_TIME = time.time()
デフsayhi(NUM):各スレッドを実行する#-defined機能
印刷( "番号で実行されている:%s" の%の数値)
time.sleep(3)
iの範囲内(50):
T = threading.Thread(目標= sayhi、引数=( 'T-%S' %I))
t.setDaemon(真)#現在のスレッドがデーモンスレッドが(t.start前に設定する必要がありますになります)
t.start()#は、スレッドを開始すると、プログラムはブロックしません
印刷( 'コスト時間:'、time.time() - START_TIME)
6. GIL グローバルインタープリタロック:同時に1つのスレッドしか操作権限のリソースを持っていることを確実にします
役割:実行の過程で、同時に一つだけのスレッド
説明: Pythonは(例えば:計算)CPU動作のみときGILロックをマルチスレッドシリアルで、パラレルその他はあまり高速シリアルよりも
1)異なるスレッドを解決するために同時に、データ保護の問題、及び生産さGILで同じリソースへのアクセス
2)GILインタプリタレベルは、プログラムに関係なく、プログラムは一つだけスレッドが実際に同時にCPUによって実行される有するオープンスレッドの実際の数を制限します
3)一つだけのスレッドは、このデータを取得することができ、同時に、この問題は、グローバルインタプリタロックのCPythonの独自の定義を解決するために、
悪い状況がPythonのスレッドは、オペレーティングシステムにネイティブスレッドを呼び出すことで可能にすることであるから、Cインタフェースであるため、4)これが発生PYTHON
5)これはそのような欠陥は、PyPyに、問題のこのバージョンのみCPythonのあります
7. スレッドロック
1)プラスねじロックリソース計算のCPU計算のスレッド動作は、その動作にロックを解除する唯一の現在のスレッドの取り組み、他のスレッドが完了
2)これは、計算されていない防ぐことができます、このリソース上の他のスレッドGILロックの解除後の動作は、混乱を引き起こし
例としては、ユーザーが使用してロック
インポート時
インポートのスレッド
ロック= threading.Lock()#1は、グローバルロックを生成します
デフaddNum():
グローバルNUM#2は、各スレッドで、このグローバル変数を取得します
印刷(「 - GET NUM、NUM)
time.sleep(1)
lock.acquire()#3をロックする前に、データを変更します
NUM - = 1つの#4この共通の操作変数-1
改変放出後lock.release()#5
8.セマフォ(セマフォ)
同時にセマフォはスレッド一定数のデータ変更を許可されている間、1 mutexは、データを変更するために一つだけのスレッドを可能にしながら、
たとえば、3つのピットのトイレが2ありますが、それが唯一のトイレで3人の最大を可能にする、人々は再入力するために、裏返しに誰かの後ろに待たなければなりません
3.効果は同じ時間は、実行中のスレッドの数をできるようです
9. スレッドプールの同時実行
インポート要求
concurrent.futuresインポートThreadPoolExecutorから
デフfetch_request(URL):
結果= requests.get(URL)
印刷(result.text)
url_list = [
「https://www.baidu.com」
「Https://www.google.com/」、#googleページは、立ち往生するタイムアウトページの後工程の終了前に知ることができます
「Http://dig.chouti.com/」、#choutiページのコンテンツは、Googleがページを返すことを待たずに、直接返されます
]
プール= ThreadPoolExecutorは、(10)#は、スレッドプールを作成する10個のスレッドを開きます
url_listでのURLの:
スレッドプールのスレッドを取得するpool.submit(fetch_request、URL)#、メソッドのfetch_requestを実行するためのスレッド
pool.shutdown(真)#メインスレッド閉まり自体ダウンし、自分のタスクの実行までの子スレッドをしましょう