Condivisione della tecnologia

Cosa sono le coroutine in Python e come implementare la programmazione asincrona in Python

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Coroutine

Una coroutine è un componente del programma che consente a più punti di ingresso di un programma di sospendere e riprendere l'esecuzione in posizioni specifiche. A differenza dei thread e dei processi, il cambio di coroutine è esplicitamente controllato dal programmatore anziché pianificato dal sistema operativo. Ciò rende la coroutine più leggera quando si eseguono cambi di contesto, poiché non è necessario salvare e ripristinare l'intero ambiente di esecuzione (come lo stack di thread).

In Python, le coroutine passano principalmenteasyncEawait Parole chiave da raggiungere. Le funzioni definite utilizzando queste parole chiave sono chiamate "funzioni coroutine" e non vengono eseguite immediatamente quando vengono chiamate, ma restituiscono invece un oggetto coroutine. Questo oggetto coroutine deve essere pianificato per l'esecuzione nel ciclo degli eventi.

Programmazione asincrona

La programmazione asincrona è un modello di concorrenza che consente a un programma di continuare a eseguire altre attività mentre attende il completamento di determinate operazioni a lunga esecuzione (come le operazioni di I/O). In Python, la programmazione asincrona viene spesso utilizzata con coroutine, la cui esecuzione è pianificata tramite un ciclo di eventi.

Come implementare la programmazione asincrona in Python

1. UtilizzareasyncEawait
  • Definire la funzione coroutine:utilizzoasync defper definire la funzione coroutine.
  • Aspetta la coroutine: All'interno della funzione coroutine è possibile utilizzareawaitper attendere il completamento di un'altra coroutine o operazione asincrona.
2. Utilizzare il ciclo degli eventi
  • Pitoneasyncio La libreria fornisce un'implementazione del ciclo di eventi. Devi assicurarti che il tuo codice asincrono venga eseguito in qualche loop di eventi.
  • utilizzoasyncio.run(main())per eseguire la funzione coroutine principale, che crea e gestisce automaticamente il loop degli eventi.
3. Codice di esempio
 

python复制代码

import asyncio
# 定义一个异步函数,模拟一个耗时的I/O操作
async def fetch_data(url):
print(f"Fetching {url}...")
# 模拟耗时操作
await asyncio.sleep(1)
return f"Data from {url}"
async def main():
# 同时启动多个异步任务
task1 = asyncio.create_task(fetch_data('http://example.com/data1'))
task2 = asyncio.create_task(fetch_data('http://example.com/data2'))
# 等待所有任务完成
result1, result2 = await asyncio.gather(task1, task2)
print(result1)
print(result2)
# 运行主协程
asyncio.run(main())

In questo esempio,fetch_dataÈ una funzione asincrona che simula le richieste di rete.mainNella funzione, ne abbiamo avviati due contemporaneamentefetch_dataun'attività e un utilizzo asincroniawait asyncio.gather()Aspetta che finiscano nello stesso momento.

4. Precauzioni
  • La programmazione asincrona e le coroutine semplificano la gestione della concorrenza, ma introducono anche nuove complessità come la gestione del contesto asincrono, la gestione degli errori, ecc.
  • Quando si progetta codice asincrono, prestare particolare attenzione a quali operazioni bloccano (ad esempio, operazioni di I/O sincrone) e utilizzare versioni asincrone di librerie e API quando possibile.
  • asyncio Fa parte della libreria standard Python e viene utilizzato per supportare le coroutine e la programmazione asincrona.Fornisce inoltre API ricche comeasyncio.Queueasyncio.Lockecc., per gestire problemi di concorrenza e sincronizzazione nel codice asincrono.