Heim >Backend-Entwicklung >Python-Tutorial >Wann sollten Sie die „Wait'-Funktion von Python 3.5 für Asyncio verwenden und wann sollten Sie sie vermeiden?

Wann sollten Sie die „Wait'-Funktion von Python 3.5 für Asyncio verwenden und wann sollten Sie sie vermeiden?

Barbara Streisand
Barbara StreisandOriginal
2024-11-17 04:41:03906Durchsuche

When should you use Python 3.5's `await` feature for asyncio, and when should you avoid it?

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:

  • Verwenden Sie Multiprocessing: Führen Sie lang andauernde Vorgänge in einem separaten Prozess aus und warten Sie auf das Ergebnis:
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)
  • Verwenden Sie ThreadPoolExecutor: Für E/A-gebundene synchrone Aufgaben, wie z. B. Anfragen an einen Webserver:
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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn