Heim  >  Artikel  >  Backend-Entwicklung  >  Ist Multi-Processing oder Multi-Threading in Python schneller?

Ist Multi-Processing oder Multi-Threading in Python schneller?

零下一度
零下一度Original
2017-06-01 10:04:493056Durchsuche

Der folgende Editor bringt Ihnen einen Artikel darüber, wer zwischen Python-Multiprozess und Multithread schneller ist (ausführliche Erklärung). Der Herausgeber findet es ziemlich gut, deshalb werde ich es jetzt mit Ihnen teilen und es allen als Referenz geben. Kommen Sie und schauen Sie sich den Editor an

Ist Multi-Processing oder Multi-Threading in Python schneller?

python3.6

Threading und Multiprocessing

Quad-Core + Samsung 250G-850-SSD

Seither verwendet Multiprozess- und Multithread-Programmierung, ich verstehe immer noch nicht, was schneller ist. Viele Leute im Internet sagen, dass Python-Multiprozesse aufgrund von GIL (Global Interpreter Lock) schneller sind. Aber als ich den Code schrieb, war die Testzeit mit Multithreading schneller. Was ist also los? Vor kurzem habe ich wieder an der Wortsegmentierung gearbeitet. Der ursprüngliche Code ist zu langsam und ich möchte ihn beschleunigen. Lassen Sie uns daher effektive Methoden untersuchen (Codes und Renderings finden Sie am Ende des Artikels)

Hier ist das Ergebnis des Programms, um zu veranschaulichen, welcher Thread oder Prozess schneller ist

Einige Definitionen

Parallelität bedeutet, dass zwei oder mehr Ereignisse gleichzeitig auftreten. Parallelität bedeutet, dass zwei oder mehr Ereignisse innerhalb desselben Zeitintervalls auftreten.

Thread ist die kleinste Einheit, in der das Betriebssystem die Berechnungsplanung durchführen kann. Es wird in den Prozess eingebunden und ist die eigentliche Bedieneinheit im Prozess. Eine Ausführungsinstanz eines Programms ist ein Prozess.

Implementierungsprozess

Das Multithreading in Python muss offensichtlich die GIL abrufen, den Code ausführen und schließlich die GIL freigeben. Aufgrund von GIL können Sie es also nicht erhalten, wenn Sie mehrere Threads verwenden. Tatsächlich handelt es sich um eine gleichzeitige Implementierung, das heißt, mehrere Ereignisse treten im gleichen Zeitintervall auf.

Aber der Prozess verfügt über eine unabhängige GIL, sodass er parallel implementiert werden kann. Daher können bei Multi-Core-CPUs theoretisch Ressourcen durch die Verwendung mehrerer Prozesse effektiver genutzt werden.

Probleme aus dem wirklichen Leben

In Online-Tutorials ist häufig Python-Multithreading zu sehen. Zum Beispiel Webcrawler-Tutorials und Port-Scanning-Tutorials.

Nehmen Sie als Beispiel das Port-Scannen. Sie können Multiprozess verwenden, um das folgende Skript zu implementieren, und Sie werden feststellen, dass Python-Multiprozess schneller ist. Steht das also nicht im Widerspruch zu unserer Analyse?

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()

Wer ist schneller?

Aufgrund des Problems der Python-Sperren verbrauchen Threads, die um Sperren konkurrieren und Threads wechseln, Ressourcen. Nehmen wir also eine mutige Vermutung:

Bei CPU-intensiven Aufgaben ist Multi-Processing schneller oder liefert bessere Ergebnisse, während bei IO-intensiven Aufgaben Multithreading die Effizienz effektiv verbessern kann.

Sehen Sie sich den folgenden Code an:

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)

Die Ergebnisse sind wie folgt:

Wie Sie Wie Sie sehen können, wird die Lücke immer größer, wenn die CPU-Auslastung immer höher wird (je mehr Codezyklen vorhanden sind). Überprüfen Sie unsere Vermutung

CPU- und IO-intensiv

1. CPU-intensiver Code (verschiedene Schleifenverarbeitung, Zählung usw.)

2. E/A-intensiver Code (Dateiverarbeitung, Webcrawler usw.)

Beurteilungsmethode:

1 . Schauen Sie sich direkt die CPU-Auslastung und die Lese- und Schreibgeschwindigkeit der Festplatte an
3. Bitte suchen Sie auf Baidu

【Verwandte Empfehlungen】

1.

Beispiele für Multiprozess und Multithreading in Python (1)

2.

Empfohlen, Multiprozess anstelle von Multithreading in Python zu verwenden? Nennen Sie die Gründe für die Empfehlung der Verwendung von Multiprozessen

3. Beispiele für Multiprozess- und Multithreading in Python (2) Programmiermethoden

4.

Über Python Detaillierte Einführung in Prozesse, Threads und Coroutinen

5.

Python-Concurrent-Programming-Thread-Pool/Prozess-Pool

Das obige ist der detaillierte Inhalt vonIst Multi-Processing oder Multi-Threading in Python schneller?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn