ホームページ  >  記事  >  バックエンド開発  >  Pythonではマルチ処理とマルチスレッドのどちらが高速ですか?

Pythonではマルチ処理とマルチスレッドのどちらが高速ですか?

零下一度
零下一度オリジナル
2017-06-01 10:04:492976ブラウズ

以下のエディターは、Pythonのマルチプロセスとマルチスレッドのどちらが速いか(詳細な説明)に関する記事をお届けします。編集者はこれがとても良いものだと思ったので、皆さんの参考として今から共有します。一緒に見てみましょう

Pythonではマルチ処理とマルチスレッドのどちらが高速ですか?

python3.6

スレッディングとマルチプロセッシング

クアッドコア + Samsung 250G-850-SSD

使用してからマルチプロセスとマルチスレッドのプログラミングについては、どちらが速いのかはまだわかりません。インターネット上では、Python のマルチプロセスは GIL (Global Interpreter Lock) のおかげで高速であると多くの人が言っています。しかし、コードを書いているときはマルチスレッドの方がテスト時間は速かったのですが、どうなっているのでしょうか?最近、また単語の分割作業を行っています。元のコードが遅すぎるので、効果的な方法を検討してみましょう (記事の最後にコードとレンダリングがあります)

結果は次のとおりです。高速

いくつかの定義

並列とは、2 つ以上のイベントが同時に発生することを意味します。同時実行性とは、同じ時間間隔内に 2 つ以上のイベントが発生することを意味します。スレッドは、オペレーティング システムが計算スケジュールを実行できる最小単位です。これはプロセスに含まれており、プロセス内の実際の操作単位となります。プログラムの実行インスタンスはプロセスです。

実装プロセス Python のマルチスレッドでは、明らかに GIL を取得し、コードを実行し、最後に GIL を解放する必要があります。したがって、GIL のせいで、複数のスレッドを使用している場合にはそれを取得できません。実際には、これは同時実装です。つまり、複数のイベントが同じ時間間隔で発生します。

ただし、プロセスには独立した GIL があるため、並行して実装できます。したがって、マルチコア CPU の場合、理論的には複数のプロセスを使用することでリソースをより効率的に利用できます。

現実の問題 オンラインチュートリアルでは、Pythonのマルチスレッドをよく見かけます。たとえば、Web クローラーのチュートリアルやポート スキャンのチュートリアルなどです。

ポートスキャンを例に挙げてみましょう。マルチプロセスを使用して次のスクリプトを実装すると、Python マルチプロセスの方が高速であることがわかります。それでは、それは私たちの分析に反していませんか?

import sys,threading
from socket import *

host = "127.0.0.1" if len(sys.argv)==1 else sys.argv[1]
portList = [i for i in range(1,1000)]
scanList = []
lock = threading.Lock()
print('Please waiting... From ',host)


def scanPort(port):
  try:
    tcp = socket(AF_INET,SOCK_STREAM)
    tcp.connect((host,port))
  except:
    pass
  else:
    if lock.acquire():
      print('[+]port',port,'open')
      lock.release()
  finally:
    tcp.close()

for p in portList:
  t = threading.Thread(target=scanPort,args=(p,))
  scanList.append(t)
for i in range(len(portList)):
  scanList[i].start()
for i in range(len(portList)):
  scanList[i].join()

誰が速いですかPythonのロック問題により、スレッドがロックを奪い合ってスレッドを切り替え、リソースを消費します。そこで、大胆な推測をしてみましょう:

CPU を集中的に使用するタスクでは、マルチ処理の方が高速またはより効果的であり、IO を集中的に使用するタスクでは、マルチスレッドが効果的に効率を向上させることができます。

以下のコードを見てみましょう:

import time
import threading
import multiprocessing

max_process = 4
max_thread = max_process

def fun(n,n2):
  #cpu密集型
  for i in range(0,n):
    for j in range(0,(int)(n*n*n*n2)):
      t = i*j

def thread_main(n2):
  thread_list = []
  for i in range(0,max_thread):
    t = threading.Thread(target=fun,args=(50,n2))
    thread_list.append(t)

  start = time.time()
  print(' [+] much thread start')
  for i in thread_list:
    i.start()
  for i in thread_list:
    i.join()
  print(' [-] much thread use ',time.time()-start,'s')

def process_main(n2):
  p = multiprocessing.Pool(max_process)
  for i in range(0,max_process):
    p.apply_async(func = fun,args=(50,n2))
  start = time.time()
  print(' [+] much process start')
  p.close()#关闭进程池
  p.join()#等待所有子进程完毕
  print(' [-] much process use ',time.time()-start,'s')

if name=='main':
  print("[++]When n=50,n2=0.1:")
  thread_main(0.1)
  process_main(0.1)
  print("[++]When n=50,n2=1:")
  thread_main(1)
  process_main(1)
  print("[++]When n=50,n2=10:")
  thread_main(10)
  process_main(10)

結果は次のとおりです:

CPU 使用率がますます高くなる (コードループが増えるほど) と、ギャップが大きくなることがわかります。どんどん大きくなってます。私たちの推測を検証してください

CPU と IO を集中的に使用する1. CPU を使用的に使用するコード (さまざまなループ処理、カウントなど)


2. IO を使用するコード (ファイル処理、Web クローラーなど)

判断方法: 1. CPU 使用率とハードディスク IO の読み取りおよび書き込み速度を直接確認します


2. より多くの計算 -> CPU の待機時間 (Web クローラーなど) -> IO


3. Baidu をお願いします

[関連する推奨事項]

1.

Python でのマルチプロセスとマルチスレッドの例 (1)

2. Python ではマルチスレッドの代わりにマルチプロセスを使用することをお勧めしますか?マルチプロセスの使用を推奨する理由を共有します

3. Pythonにおけるマルチプロセスとマルチスレッドの例(2) プログラミング方法

4. Pythonのプロセス、スレッド、コルーチンの詳細な紹介

5. Python 同時実行プログラミング スレッド プール/プロセス プール

以上がPythonではマルチ処理とマルチスレッドのどちらが高速ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。