Python lernen - asyncio

asyncio ist eine in Python 3.4 eingeführte Standardbibliothek, die asynchrone E / A direkt unterstützt.

Das Programmiermodell von asyncio ist eine Nachrichtenschleife. Wir erhalten direkt einen Verweis auf EventLoop vom Asyncio-Modul und werfen dann die Coroutine, die zur Ausführung ausgeführt werden muss, in EventLoop, und dann wird eine asynchrone E / A realisiert.

Verwenden Sie asyncio, um den Hello-Weltcode wie folgt zu implementieren:

import asyncio

@asyncio.coroutine
def hello():
	print('Hello world!')
	# 异步调用asyncio.sleep(1):
	r = yield from asyncio.sleep(1)
	print("Hello again!")

# 获取EventLoop:
loop = asyncio.get_event_loop()
# 执行coroutine
loop.run_until_complete(hello())
loop.close()

@ asyncio.coroutine markiert einen Generator als Coroutine-Typ, und dann werfen wir diese Coroutine zur Ausführung in EventLoop.

hallo () druckt Hu Hallo Weltneuheit! Die Ausbeute aus der Syntax ermöglicht es uns, bequem einen anderen Generator aufzurufen. Da asyncio.sleep () auch eine Coroutine ist, wartet der Thread nicht auf asyncio.sleep (), sondern unterbricht direkt die nächste Nachrichtenschleife und führt sie aus. Wenn asyncio.sleep () zurückgegeben wird, kann der Thread den Rückgabewert von yield von (hier ist None) abrufen und dann die nächste Anweisungszeile ausführen.

Betrachten Sie asyncio.sleep (1) als eine E / A-Operation, die 1 Sekunde dauert. Während dieser Zeit wartet der Hauptthread nicht, sondern führt andere ausführbare Coroutinen in EventLoop aus, sodass eine gleichzeitige Ausführung erreicht werden kann.

Versuchen wir, zwei Coroutinen mit Task zu kapseln:

import threading
import asyncio

@asyncio.coroutine
def hello():
	print('Hello world! (%s)' % threading.currentThread())
	yield from asyncio.sleep(1)
	print('Hello again! (%s)' % threading.currentThread())

loop = asyncio.get_event_loop()
tasks = [hello(), hello()]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

Beobachten Sie den Ausführungsprozess:

Hello world! (<_MainThread(MainThread, started 140735195337472)>)
Hello world! (<_MainThread(MainThread, started 140735195337472)>)
(暂停约1)
Hello again! (<_MainThread(MainThread, started 140735195337472)>)
Hello again! (<_MainThread(MainThread, started 140735195337472)>)

Aus dem gedruckten aktuellen Threadnamen ist ersichtlich, dass die beiden Coroutinen gleichzeitig von demselben Thread ausgeführt werden.

Wenn Sie asyncio.sleep () durch eine echte E / A-Operation ersetzen, können mehrere Coroutinen gleichzeitig von einem Thread ausgeführt werden.

Wir verwenden die asynchrone Netzwerkverbindung von asyncio , um die Homepage von sina, sohu und 163 zu erhalten:

import asyncio

@asyncio.coroutine
def wget(host):
	print('wget %s...' % host)
	connect = asyncio.open_connection(host, 80)
	reader, writer = yield from connect
	header = 'GET / HTTP/1.0\r\nHost: %s\r\n\r\n' % host
    writer.write(header.encode('utf-8'))
    yield from writer.drain()
    while True:
    	line = yield from reader.readline()
    	if line == b'\r\n':
            break
        print('%s header > %s' % (host, line.decode('utf-8').rstrip()))
    # Ignore the body, close the socket
    writer.close()

loop = asyncio.get_event_loop()
tasks = [wget(host) for host in ['www.sina.com.cn', 'www.sohu.com', 'www.163.com']]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
    	

Die Ergebnisse sind wie folgt:

wget www.sohu.com...
wget www.sina.com.cn...
wget www.163.com...
(等待一段时间)
(打印出sohu的header)
www.sohu.com header > HTTP/1.1 200 OK
www.sohu.com header > Content-Type: text/html
...
(打印出sina的header)
www.sina.com.cn header > HTTP/1.1 200 OK
www.sina.com.cn header > Date: Wed, 20 May 2015 04:56:33 GMT
...
(打印出163的header)
www.163.com header > HTTP/1.0 302 Moved Temporarily
www.163.com header > Server: Cdn Cache Server V2.0
...

Es ist ersichtlich, dass 3 Verbindungen gleichzeitig von einem Thread durch Coroutine abgeschlossen werden.

Zusammenfassung

asyncio bietet vollständige asynchrone E / A-Unterstützung.

Asynchrone Operationen müssen durch Ausbeute von in Coroutine abgeschlossen werden;

Mehrere Coroutinen können in eine Reihe von Aufgaben gepackt und dann gleichzeitig ausgeführt werden.
(Schlüssel: Gleichzeitige Ausführung nach dem Einkapseln einer Gruppe von Aufgaben)

Ich denke du magst

Origin blog.csdn.net/qq_44787943/article/details/112643697
Empfohlen
Rangfolge