- 序文
- 並行プログラミングの基本概念
- VS VSシングルスレッドのマルチスレッドとマルチプロセス
- 調査結果の性能比較のまとめ
序文
アドバンスシリーズの支店として并发编程
「」私は、これはすべてのプログラマはであるべきだと思います。
并发编程
このシリーズは、私はあなたがより徹底的にこの知識は、それが簡単にスポットすることができます理解するために例を引用したいと思いますし、知識をコーミング、ほぼ一週間のために用意しました。結果の発表は本当にのように白にあまりにも優しい、それを想像することを希望。
大体、私はおそらく次のように言うでしょう。このシリーズを終えた昨日(後者は調整することができます):
コース概要
並行プログラミングのために、Pythonの実装は、どのような、大きく以下の三つの方法をまとめました。
- マルチスレッド
- マルチプロセス
- コルーチン(発電機)
以下の章では、我々は、これらの3つの知識ポイントをご紹介するために別の後になります。
並行プログラミングの基本概念
あなたは知識の理論を説明するために開始する前に、いくつかの基本的な概念で1人のを見ていました。それは、高度なコースですが、私はまた、より多くのユーザーフレンドリーな、より白い書きたいが。
串行
:同時にAの人は、このようなテレビを見るために夕食後など、一つのことを行うことができます; 并行
:同じ期間の男は、より多くのまたはものになるかもしれテレビを見ながら、たとえば、あなたが食べることができます。
Pythonで、多线程
かつ 协程
厳密であるがシリアルであるが、非常にシリアルプログラムの実装の平均効率よりも高いです。
プログラムはブロックされたとだけ待つことができる一般的なシリアルプログラムは、他のことを行うことはできません。同様に、テレビドラマで放映され、広告時間に、私たちは食事を食べるために広告時間を利用することはできません。プログラムの場合、これは無理がある、明らかに非常に低い効率です。
もちろん、このコースを完了した後、我々は、広告時間の使用は、柔軟なタイムスケジュールを他の事をすることを理解しています。我々はこのためです多线程
し、协程
あなたがプログラムの最大の効率を作り、物事、内部の合理的な管理タスクを達成するために私たちを助けたいです。
が、 多线程
そして 协程
非常にスマート。しかし、まだない効率的なことに、テレビチャットを見ながら食べて、最も効率的なマルチタスクでなければなりません。これが私たちのある 多进程
物事を行う能力。
あなたがより良いインターネット上の2枚の絵を見つけるために、より直感的な理解を助けるために、鮮やかにマルチスレッドとマルチプロセスの違いを説明します。(侵攻は削除しました)
-
多线程
別の方法としては、別の意味でのシリアルを実行します。 -
多进程
、並行して、本当の意味での同時。
。VSは、マルチスレッド、マルチプロセスVSは、シングルスレッド
千本の言葉は、数行のコードがKongwuyouliを来るようテキストは常に良いとしてではなく、青白いです。
まず、以下のように、私のテスト環境の構成があります
オペレーティングシステム | CPUコアの数 | メモリー(G) | ハードディスク |
---|---|---|---|
CentOSの7.2 | 24核 | 32 | 機械的なハードドライブ |
なお、
次のコードは、理解するために、白のポイントその知識を持っています:
- デコレータを使用してください
- 基本的な使用のマルチスレッド
- 複数のプロセスの基本的な使用
もちろん、最後まで、それは問題で、主な結論は、この効果を達成するために、マルチスレッド誰もが、マルチプロセス、シングルスレッドの実現への一般的な効果を明確に理解を持ってできるように、この記事のミッションが終了していない待機を理解していません、完全なシリーズを学び、周りに戻ってきて、より深い理解があるかもしれません理解することを望むかもしれません。
シングルスレッド、私たちは見てみましょう、マルチスレッドとマルチプロセス、強いまたは操作中に弱いかどうか。
あなたが比較を開始する前に、最初のシナリオの4つのタイプを定義
- CPU集約型コンピューティング
- ディスクIOの集中
- IO集約型ネットワーク
- アナログIO集約型[]
なぜ、これらのタイプのシナリオがあり、これは、多线程
多进程
シーンに適用されます。結論として、私が説明しましょう。
# CPU计算密集型
def count(x=1, y=1):
# 使程序完成150万计算
c = 0
while c < 500000:
c += 1
x += x
y += y
# 磁盘读写IO密集型
def io_disk():
with open("file.txt", "w") as f:
for x in range(5000000):
f.write("python-learning\n")
# 网络IO密集型
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'}
url = "https://www.tieba.com/"
def io_request():
try:
webPage = requests.get(url, headers=header)
html = webPage.text
return
except Exception as e:
return {"error": e}
# 【模拟】IO密集型
def io_simulation():
time.sleep(2)
競争指標は、我々は検討する時間を使用しています。短い時間では、より高い効率を過ごしました。
便宜上、より簡潔なコードを見て作る、私はここに簡単な定義することです 时间计时器
デコレータを。
あなたは非常にデコレータを理解していない場合、それは限り、あなたはそれで時間の関数を計算するのに使用されるものを知っているように、問題ではありません。
def timer(mode):
def wrapper(func):
def deco(*args, **kw):
type = kw.setdefault('type', None)
t1=time.time()
func(*args, **kw)
t2=time.time()
cost_time = t2-t1
print("{}-{}花费时间:{}秒".format(mode, type,cost_time))
return deco
return wrapper
最初のステップは、シングルスレッドを見てみましょう
@timer("【单线程】")
def single_thread(func, type=""):
for i in range(10):
func()
# 单线程
single_thread(count, type="CPU计算密集型")
single_thread(io_disk, type="磁盘IO密集型")
single_thread(io_request,type="网络IO密集型")
single_thread(io_simulation,type="模拟IO密集型")
結果を見てください
【单线程】-CPU计算密集型花费时间:83.42633867263794秒
【单线程】-磁盘IO密集型花费时间:15.641993284225464秒
【单线程】-网络IO密集型花费时间:1.1397218704223633秒
【单线程】-模拟IO密集型花费时间:20.020972728729248秒
第二の工程、マルチスレッドを見
@timer("【多线程】")
def multi_thread(func, type=""):
thread_list = []
for i in range(10):
t=Thread(target=func, args=())
thread_list.append(t)
t.start()
e = len(thread_list)
while True:
for th in thread_list:
if not th.is_alive():
e -= 1
if e <= 0:
break
# 多线程
multi_thread(count, type="CPU计算密集型")
multi_thread(io_disk, type="磁盘IO密集型")
multi_thread(io_request, type="网络IO密集型")
multi_thread(io_simulation, type="模拟IO密集型")
結果を見てください
【多线程】-CPU计算密集型花费时间:93.82986998558044秒
【多线程】-磁盘IO密集型花费时间:13.270896911621094秒
【多线程】-网络IO密集型花费时间:0.1828296184539795秒
【多线程】-模拟IO密集型花费时间:2.0288875102996826秒
第3のステップは、最後のマルチプロセスを見ることです
@timer("【多进程】")
def multi_process(func, type=""):
process_list = []
for x in range(10):
p = Process(target=func, args=())
process_list.append(p)
p.start()
e = process_list.__len__()
while True:
for pr in process_list:
if not pr.is_alive():
e -= 1
if e <= 0:
break
# 多进程
multi_process(count, type="CPU计算密集型")
multi_process(io_disk, type="磁盘IO密集型")
multi_process(io_request, type="网络IO密集型")
multi_process(io_simulation, type="模拟IO密集型")
結果を見てください
【多进程】-CPU计算密集型花费时间:9.082211017608643秒
【多进程】-磁盘IO密集型花费时间:1.287339448928833秒
【多进程】-网络IO密集型花费时间:0.13074755668640137秒
【多进程】-模拟IO密集型花费时间:2.0076842308044434秒
結果の要約の性能比較
その結果を表に、それをまとめています。
種 | CPU集約型コンピューティング | ディスクIOの集中 | IO集約型ネットワーク | アナログIO集約型 |
---|---|---|---|---|
シングルスレッド | 83.42 | 15.64 | 1.13 | 20.02 |
マルチスレッド | 93.82 | 13.27 | 0.18 | 2.02 |
マルチプロセス | 9.08 | 1.28 | 0.13 | 2.01 |
私たちは、このフォームを分析する必要があります。
まずCPU密集型
、それは同じ時間の計算に複数のCPUであるため、スレッドと時間がかかり、非効率的、かつマルチプロセスを切り替え、明らかによる継続的なグローバルロックGILロック解除に、マルチスレッドのシングルスレッドだけでなく、何の利点を比較しないように、10人の同等は明らかに効率が飛躍的に成長している、人間の仕事をします。
そして、集約型IOは、IO密集型
することができ磁盘IO
、网络IO
、数据库IO
というように、同じクラスに属するすべてのは、非常に小さい、時間のほとんどは、廃棄物のIOを待つれる金額を計算します。我々は、ディスクIO、IOデータネットワークを見つけることができる観察を通じて、マルチスレッドのシングルスレッド化比較はに大きな利点を反映していませんでした。これは、我々のプログラムのIOタスクが原因で重くないので、利点は明白ではありません。
私はそうも追加模拟IO密集型
「」使用sleep
IO待ち時間をシミュレートするには、マルチスレッドの利点を反映するためですが、また、私たちにマルチスレッドプロセスの作業をより直感的に理解することができます。各スレッドはシングルスレッドである必要があるsleep(2)
、スレッドは10であり20s
、そしてマルチスレッドにsleep(2)
時間、同時に10件のスレッドがそうすることを、別のスレッドに切り替わりsleep(2)
、それが唯一の最終的な10個のスレッドでした2s
。
以下の結論を引き出すことができます
- 常に最も遅いシングルスレッド、マルチプロセスは、常に最速です。
- で使用するのに適した、このような爬虫類、Webサイトの開発などIO集約型のシーンを、マルチスレッド
- CPU上で複数のプロセスで使用するのに適しているのは、このような大規模なデータ解析などに必要な高い動作シナリオ、機械学習を算出します
- それはサポートに低CPUリソースの利点を実現するために必要とするため、マルチプロセスは、必ずしも最良の選択は常に最速ですが、ではないが、