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
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】
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Über Python Detaillierte Einführung in Prozesse, Threads und CoroutinenPython-Concurrent-Programming-Thread-Pool/Prozess-PoolDas 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!