Asyncio So nutzen Sie Selektoren

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Asyncio So nutzen Sie Selektoren

by Anonymous » 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

Code: Select all

import types

@types.coroutine
def wait(seconds: int) -> None:
start_time = time.time()

while time.time() - start_time < seconds:
yield
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.

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

Code: Select all

@types.coroutine
async def request(url: str) -> None:
loop = asyncio.get_event_loop()
await loop.sock_connect(url, 80)
...

Top