기술나눔

Python의 코루틴이란 무엇이며 Python에서 비동기 프로그래밍을 구현하는 방법

2024-07-12

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

코루틴

코루틴은 프로그램에 대한 여러 진입점이 특정 위치에서 실행을 일시 중지하고 재개할 수 있도록 하는 프로그램 구성 요소입니다. 스레드 및 프로세스와 달리 코루틴 전환은 운영 체제에 의해 예약되지 않고 프로그래머에 의해 명시적으로 제어됩니다. 전체 실행 환경(예: 스레드 스택)을 저장하고 복원할 필요가 없기 때문에 컨텍스트 전환을 수행할 때 코루틴을 더 가볍게 만듭니다.

Python에서 코루틴은 주로 다음을 전달합니다.async그리고await 달성할 키워드. 이러한 키워드를 사용하여 정의된 함수를 "코루틴 함수"라고 하며 호출 시 즉시 실행되지 않고 대신 코루틴 객체를 반환합니다. 이 코루틴 객체는 이벤트 루프에서 실행되도록 예약되어야 합니다.

비동기 프로그래밍

비동기 프로그래밍은 특정 장기 실행 작업(예: I/O 작업)이 완료되기를 기다리는 동안 프로그램이 다른 작업을 계속 수행할 수 있도록 하는 동시성 모델입니다. Python에서는 이벤트 루프를 통해 실행이 예약되는 코루틴과 함께 비동기 프로그래밍이 자주 사용됩니다.

Python에서 비동기 프로그래밍을 구현하는 방법

1. 사용async그리고await
  • 코루틴 함수 정의:사용async def코루틴 함수를 정의합니다.
  • 코루틴을 기다립니다: 코루틴 함수 내에서 다음을 사용할 수 있습니다.await다른 코루틴이나 비동기 작업이 완료될 때까지 기다립니다.
2. 이벤트 루프 사용
  • 파이썬asyncio 라이브러리는 이벤트 루프의 구현을 제공합니다. 비동기 코드가 일부 이벤트 루프에서 실행되는지 확인해야 합니다.
  • 사용asyncio.run(main())이벤트 루프를 자동으로 생성하고 관리하는 기본 코루틴 기능을 실행합니다.
3. 샘플 코드
 

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

이 예에서는fetch_data네트워크 요청을 시뮬레이션하는 비동기 함수입니다.main기능에서는 동시에 두 개를 시작했습니다.fetch_data비동기 작업 및 사용await asyncio.gather()동시에 끝날 때까지 기다리십시오.

4. 주의사항
  • 비동기 프로그래밍과 코루틴을 사용하면 동시성을 더 쉽게 처리할 수 있지만 비동기 컨텍스트 관리, 오류 처리 등과 같은 새로운 복잡성도 발생합니다.
  • 비동기 코드를 디자인할 때 어떤 작업이 차단되는지(예: 동기 I/O 작업)에 특히 주의하고 가능하면 비동기 버전의 라이브러리 및 API를 사용하세요.
  • asyncio Python 표준 라이브러리의 일부이며 코루틴 및 비동기 프로그래밍을 지원하는 데 사용됩니다.또한 다음과 같은 풍부한 API를 제공합니다.asyncio.Queueasyncio.Lock비동기 코드의 동시성 및 동기화 문제를 처리하는 데 사용됩니다.