Wann man die Funktion „await“ von Python 3.5 für Asyncio nutzen und vermeiden sollte
Python 3.5 führte das Schlüsselwort „await“ ein, um die asynchrone Programmierung mit asyncio zu erleichtern. Es ist jedoch nicht immer klar, auf welche Vorgänge gewartet werden sollte, um die Effizienz zu maximieren.
Bestimmung asynchroner Kandidaten
Eine Faustregel besteht darin, jede Funktion abzuwarten, die eine I/O ausführt. O-Vorgang, z. B. Zugriff auf das Netzwerk oder Lesen von Dateien. Diese Vorgänge können möglicherweise synchronen Code für einen längeren Zeitraum blockieren. Indem Asyncio darauf wartet, kann es andere Vorgänge gleichzeitig ausführen.
Vorteile von asynchronem Code
Wie im folgenden Codeausschnitt gezeigt, kann asynchroner Code die damit verbundenen Vorgänge erheblich beschleunigen mehrere I/O-Aufrufe:
# Synchronous way: download(url1) # takes 5 sec. download(url2) # takes 5 sec. # Total time: 10 sec. # Asynchronous way: await asyncio.gather( async_download(url1), # takes 5 sec. async_download(url2) # takes 5 sec. ) # Total time: only 5 sec. (+ little overhead for using asyncio)
Funktionen mit gemischtem Async/Synchronous Code
Asynchrone Funktionen können sowohl asynchrone als auch synchrone Funktionen aufrufen. Es bietet jedoch keinen Vorteil, auf synchronen Code zu warten, der keine E/A-Vorgänge ausführt. Dies kann zu unnötigem Overhead führen:
async def extract_links(url): # async_download() was created async to get benefit of I/O html = await async_download(url) # parse() doesn't work with I/O, there's no sense to make it async links = parse(html) return links
Vermeiden Sie lang andauernde synchrone Vorgänge.
Es ist wichtig, lang andauernde synchrone Vorgänge (> 50 ms) innerhalb von asynchronen Vorgängen zu vermeiden Funktionen, da sie alle anderen asynchronen Aufgaben einfrieren können. Um diese Aufgaben effizient zu erledigen:
executor = ProcessPoolExecutor(2) async def extract_links(url): data = await download(url) links = parse(data) # Now your main process can handle another async functions while separate process running links_found = await loop.run_in_executor(executor, search_in_very_big_file, links)
executor = ThreadPoolExecutor(2) async def download(url): response = await loop.run_in_executor(executor, requests.get, url) return response.text
Das obige ist der detaillierte Inhalt vonWann sollten Sie die „Wait'-Funktion von Python 3.5 für Asyncio verwenden und wann sollten Sie sie vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!