Python의 비동기 for 루프

Abdul Mateen 2023년10월10일
  1. Python의 비동기 함수
  2. Python의 비동기 for 루프
Python의 비동기 for 루프

이 튜토리얼은 Python의 비동기 for 루프에 대한 완전한 세부 정보를 제공합니다. 비동기 함수, 비동기 for 루프 및 sleep 개념에 대해 설명합니다.

다음으로 Python 라이브러리 asyncio와 비동기 코드를 실행하는 데 필요한 기능에 대해 설명합니다. 마지막으로 개념을 완전히 이해하기 위해 Python에서 몇 가지 예를 볼 것입니다.

Python의 비동기 함수

비동기 기능은 동일한 프로그램의 다른 기능과 병렬로 무거운 작업(백그라운드에서 프로세스를 실행하는 데 관심이 있는 배치 프로그램과 같은)을 실행하는 데 도움이 됩니다. 함수가 서로 종속되지 않거나 완전히 종속되지 않은 경우 함수를 병렬로 실행할 수 있습니다.

동기식 함수는 작업이 완료되면 제어권을 반환하는 반면, 비동기식 함수는 다른 함수/코드를 병렬로 실행하기 위한 제어권을 반환하고 얼마 후 다시 제어권을 얻습니다. 이러한 방식으로 무거운 작업이 완료될 뿐만 아니라 다른 많은 작업도 병렬로 완료됩니다.

기술적으로 동기식 함수는 main 기능의 제어를 차단하는 반면 비동기식 기능은 main 기능을 차단하지 않고 실행됩니다. 이러한 방식으로 main 기능은 여러 비동기 기능을 병렬로 실행할 수 있습니다.

Python의 비동기 for 루프

동기 루프의 경우 일시 중지/제공 제어 없이 실행됩니다. 그러나 그것들을 비동기식으로 만들려면 일부 비동기식 함수에서 정의해야 합니다. 또한 다른 기능에 제어권을 부여하려면 일정 시간 동안 이 프로세스에서 잠을 자야 합니다.

sleep 문 사용

프로세스/스레드/함수는 한동안 잠자기 상태가 될 수 있습니다. 휴식이라고 생각할 수 있습니다. 그러나 목적은 일정 기간 동안 통제력을 상실하는 것입니다.

결과적으로 일부 다른 기능이 제어권을 얻습니다. 일정 시간이 지나면 컨트롤이 돌아가고 기능이 다시 시작됩니다.

이제 Python에서 구현으로 이동할 때입니다. 구문 부분을 단계별로 설명하고 마지막에 전체 코드를 표시합니다.

Python 라이브러리 및 함수

asyncioasync/await 구문을 사용하여 동시 프로그램/함수를 작성하는 Python 라이브러리입니다. async는 모든 함수의 시작 부분에서 (비동기 함수를 생성하기 위해) 사용되는 키워드입니다.

구문은 다음과 같습니다.

async def fun_a(t):

여기에 async가 추가되어 이 함수를 비동기 함수로 선언합니다.

sleep 기능은 일정 기간 동안 코루틴 실행을 일시 중지할 수 있습니다. 코루틴은 실행 중에 파이프라인 구조를 만드는 프로세스/함수입니다.

이 기능은 await 키워드를 통해 다른 협력 작업을 위해 자발적으로 CPU를 떠납니다. sleep 함수의 구문은 다음과 같습니다.

await asyncio.sleep(1)

참고: 키워드 await는 라이브러리에서든 사용자 정의 함수에서든 모든 비동기 함수를 호출하는 데 필요합니다.

await 키워드는 컨트롤을 이벤트 루프로 반환합니다. 비동기 함수가 await 명령을 사용하여 호출하는 경우 sleep 문(for 루프 내부)이 절전 상태가 될 때까지 협력 프로세스를 제어한다고 생각할 수 있습니다.

gather 기능은 하나의 단위로 실행하기 위해 여러 협력 프로세스(기술적으로는 코루틴 만들기)를 결합합니다. 이 함수는 gather 호출에 작성된 함수 순서대로 결과 튜플을 반환합니다.

구문은 다음과 같습니다.

results = await asyncio.gather(fun_a(5), fun_b(5))

여기에서 fun_afun_b 파이프라인을 만들어 동시에 실행할 수 있습니다.

이벤트 루프는 모든 비동기 애플리케이션의 주요 요소입니다. 이벤트 루프는 비동기 함수를 실행합니다.

get_event_loop() 메서드는 set_event_loop가 아직 호출되지 않았는지 확인하고 이벤트 루프를 생성하고 현재로 설정합니다. 구문은 다음과 같습니다.

my_loop = asyncio.get_event_loop()

루프가 이미 생성된 상태에서 이 명령을 두 번째로 실행하면 아무 작업도 수행되지 않습니다. 그러나 첫 번째 호출에서는 루프가 생성되지 않습니다. 따라서 비동기 루프를 생성합니다.

run_until_complete()get_event_loop()에 의해 반환된 루프가 비동기인 경우 이벤트 루프를 동시에 실행하는 데 사용됩니다. 구문은 다음과 같습니다.

my_loop.run_until_complete(main())

이 명령문은 main 기능이 비동기인 경우 코드를 동시에 실행합니다.

비동기 코드

비동기 함수/루틴/프로세스를 실행하는 데 필요한 개념과 Python 라이브러리에 대한 명확한 아이디어가 있으면 완전한 코딩 예제를 볼 시간입니다.

import asyncio


async def fun_a(t):
    for i in range(t):
        print("fun_a", end=" ")
        await asyncio.sleep(1)
    return 1


async def fun_b(t):
    for i in range(t):
        print("fun_b", end=" ")
        await asyncio.sleep(1)
    return 2


async def main():
    results = await asyncio.gather(fun_a(5), fun_b(5))
    print(results)


my_loop = asyncio.get_event_loop()
my_loop.run_until_complete(main())

이 코드의 맨 위(첫 줄)에서 asyncio 라이브러리를 가져옵니다. 이 라이브러리에는 비동기 함수를 호출하여 동시에 실행하는 데 필요한 함수가 있습니다. 그들은 이미 구문으로 논의되었습니다.

다음으로 동시에 실행하려는 두 개의 비동기 함수 fun_afun_b가 있습니다. 다시 말하지만 우리는 메인 함수에서 비동기 함수를 호출하려고 합니다. 따라서 main 도 비동기 함수로 생성됩니다.

또한 5를 함수에 전달하여 내부 루프를 5번 실행합니다. 따라서 나중에 출력을 보고 루프가 완전히 실행되고 있지 않다는 아이디어를 얻을 수 있습니다. 각각은 절전 상태로 전환되고 다른 기능에 제어권을 부여합니다.

출력 후에 이 점을 반복합니다.

main 함수 내에서 gather 함수를 호출하고 비동기 함수를 전달하여 병렬로 실행할 수 있도록 했습니다. gather 함수는 대상 비동기 함수에서 반환된 두 개의 값이 있는 튜플을 반환합니다.

드디어 마지막 두 줄에 와 있습니다. 두 번째 마지막 줄에서 get_event_loop 함수를 호출하여 루프를 생성했습니다. 마지막 줄에서 루프를 사용하여 run_until_complete 기능을 호출하여 main 기능을 비동기적으로 실행하기 시작했습니다.

이 코드의 출력은 다음과 같습니다.

fun_a fun_b fun_a fun_b fun_a fun_b fun_a fun_b fun_a fun_b [1, 2]

첫째, 루프가 기존 코드처럼 완전히 실행되지 않는다는 점에 유의하십시오. 대신 두 루프가 동시에 실행됩니다. 두 기능 인쇄문의 결과를 볼 수 있습니다.

마지막으로 [1, 2]는 비동기 함수에서 main 함수가 수신한 튜플입니다. 12는 비동기 함수에 의해 반환되며 gather 함수에서 이러한 함수를 작성한 순서대로 정렬됩니다.

관련 문장 - Python Loop