Asyncio So nutzen Sie Selektoren
Posted: 18 Aug 2025, 06:08
asyncio verwendet eine Ereignisschleife, um Methoden zu pausieren und wieder aufzunehmen. Zum Beispiel können Sie ein einfaches Korotin wie dieses < /p>
implementieren
Diese Methode wartet mindestens n Sekunden. Aber es ist natürlich möglich, dass es mehr wartet als n Sekunden, da es nur dann weitergeht, wenn es wieder aufgenommen wird, was bei der nächsten Loop-Iteration erfolgt. (die eine zeitliche Komplexität von o (1)). Es wäre großartig, die Funktionalität zu haben, die Ausführung der Methode (Generator) nur dann wieder aufzunehmen, wenn der Socket wirklich fertig ist. Aber ich konnte nicht herausfinden, ob dies Selektoren unter der Motorhaube verwendet.
implementieren
Code: Select all
import types
@types.coroutine
def wait(seconds: int) -> None:
start_time = time.time()
while time.time() - start_time < seconds:
yield
Code: Select all
import socket
from socket import BlockingIOError
@types.coroutine
def request(url: str) -> None:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((url, 80))
s.send(f'GET / HTTP/1.1\nHost: {url}\n\n'.encode())
s.setblocking(False)
response = b''
while True:
try:
data = s.recv(1024)
response += data
except BlockingIOError:
if response:
break
yield
< /code>
Diese Methode überprüft jede Iteration, um festzustellen, ob Daten abgerufen werden können. Wenn ja, fahren Sie mit den anderen Aufgaben in der Ereignisschleife fort. Zum Beispiel im Fall von Linux ist dies epoll
Code: Select all
@types.coroutine
async def request(url: str) -> None:
loop = asyncio.get_event_loop()
await loop.sock_connect(url, 80)
...