Ich werde Ihnen zeigen, wie Sie mit Python zwei oder mehr Prozesse gleichzeitig ausführen
--Faden
Mit Threads können Sie mehrere Funktionen gleichzeitig ausführen. Es funktioniert, wenn Sie die Funktion als "Ziel" an die Klasse "threading.Thread" übergeben und mit "start ()" starten.
import time
import threading
def func1():
while True:
print("func1")
time.sleep(1)
def func2():
while True:
print("func2")
time.sleep(1)
if __name__ == "__main__":
thread_1 = threading.Thread(target=func1)
thread_2 = threading.Thread(target=func2)
thread_1.start()
thread_2.start()
Ausführungsergebnis
func1
func2
func2
func1
func1
func2
func2
func1
Es ist noch leistungsfähiger, wenn Sie das Paket concurrent.futures von Python 3.2 oder höher verwenden. Verwenden Sie die ThreadPoolExecutor-Klasse.
Wenn Sie festlegen, dass die maximale Anzahl "max_workers" zuerst gleichzeitig ausgeführt werden soll, werden wieder Threads verwendet, sodass sie intelligenter sind als die oben eingeführten normalen Threads. Wenn Sie eine neuere Version von Python haben, können Sie diese aktiv verwenden.
import time
import concurrent.futures
def func1():
while True:
print("func1")
time.sleep(1)
def func2():
while True:
print("func2")
time.sleep(1)
if __name__ == "__main__":
executor = concurrent.futures.ThreadPoolExecutor(max_workers=2)
executor.submit(func1)
executor.submit(func2)
Ausführungsergebnis
func1
func2
func1
func2
func1
func2
func1
func2
Das gleiche concurrent.futures-Paket wie oben, wird jedoch anstelle des Thread-Pools ** Prozesspool ** genannt. Es gibt auch.
Durch die Aufteilung in Prozesseinheiten anstelle von Threads unterliegen Sie nicht den Global Interpreter Lock (GIL) -Einschränkungen ** Sie können mit mehreren Kernen arbeiten. ** ** ** Da jedoch ein Prozess verwendet wird, der größer als der Thread ist, können sich andere Einschränkungen erhöhen. Hinweis!
Es ist einfach zu bedienen, ändern Sie einfach den oben eingeführten "ThreadPoolExecutor" in "ProcessPoolExecutor".
import time
import concurrent.futures
def func1():
while True:
print("func1")
time.sleep(1)
def func2():
while True:
print("func2")
time.sleep(1)
if __name__ == "__main__":
executor = concurrent.futures.ProcessPoolExecutor(max_workers=2)
executor.submit(func1)
executor.submit(func2)
Ausführungsergebnis
func1
func2
func1
func2
func1
func2
func1
func2
Es gibt auch eine Möglichkeit, mehrere Prozesse in einem Thread auszuführen. Eine davon ist die ** Ereignisschleife **. In Python3.4 oder höher kann dies mit asyncio module realisiert werden.
Es ist leicht zu verstehen, welchen Unterschied es zu Multithreading gibt und wann es verwendet wird ... indem Sie Asynchrone Verarbeitung in Python: Asyncio Reverse Lookup-Referenz lesen. ..
Es ist viel effizienter als das Erhöhen der Anzahl von Threads für asynchrone E / A wie Kommunikation und Dateieingabe / -ausgabe, aber es ist schwierig, sich daran zu gewöhnen, da das Konzept schwierig ist.
Der Beispielcode unterscheidet sich stark vom Thread-Fall.
Wir verwenden "asyncio.sleep" anstelle von "time.sleep", um zu warten, da wir "asyncio.sleep" aufrufen und während des Wartens zu einem anderen parallelen Prozess wechseln. Es ist nur ein Collout.
import asyncio
@asyncio.coroutine
def func1():
while True:
print("func1")
yield from asyncio.sleep(1)
@asyncio.coroutine
def func2():
while True:
print("func2")
yield from asyncio.sleep(1)
if __name__ == "__main__":
loop = asyncio.get_event_loop()
tasks = asyncio.wait([func1(), func2()])
loop.run_until_complete(tasks)
Ausführungsergebnis
func2
func1
func2
func1
func2
func1
func2
func1
Recommended Posts