Asyncio So nutzen Sie SelektorenPython

Python-Programme
Anonymous
 Asyncio So nutzen Sie Selektoren

Post by Anonymous »

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post