>  기사  >  백엔드 개발  >  Python에서 비동기 작업을 생성하고 실행하는 방법

Python에서 비동기 작업을 생성하고 실행하는 방법

WBOY
WBOY앞으로
2023-05-13 13:31:121690검색

    1. 비동기 작업이란 무엇입니까

    비동기 작업은 비동기 코루틴을 독립적으로 예약하고 실행하는 개체입니다. 이는 asyncio 프로그램이 코루틴과 상호작용하기 위해 쿼리하고 사용할 수 있는 전달된 코루틴에 대한 핸들을 제공합니다.

    작업은 코루틴에서 생성됩니다. 코루틴 개체를 가져와서 코루틴을 래핑하고 실행을 예약하고 상호작용할 수 있는 메서드를 제공합니다. 작업은 독립적으로 실행됩니다. 이는 asyncio 이벤트 루프에서 예약되고 이를 생성한 코루틴에서 발생하는 것과 관계없이 실행된다는 것을 의미합니다. 이는 호출자가 코루틴이 완료될 때까지 기다려야 하는 코루틴을 직접 실행하는 것과 다릅니다.

    asyncio.Task 클래스는 asyncio.Future 클래스를 확장하며 인스턴스가 대기 가능합니다. Future는 결국 도착할 결과를 나타내는 하위 수준 클래스입니다. Future 클래스를 확장하는 클래스를 흔히 Future-like라고 합니다.

    비동기 작업은 대기 가능하므로 이는 코루틴이 작업이 완료될 때까지 기다리기 위해 대기 표현식을 사용할 수 있음을 의미합니다.

    ...
    # wait for a task to be done
    await task

    이제 비동기 작업이 무엇인지 알았으니 이를 만드는 방법을 살펴보겠습니다.

    2. 작업 생성 방법

    제공된 코루틴 인스턴스를 사용하여 작업을 생성합니다. 코루틴은 async def 표현식을 사용하여 정의되고 함수처럼 보인다는 점을 기억하세요.

    # define a coroutine
    async def task_coroutine():
    	# ...

    작업은 코루틴에서만 생성하고 예약할 수 있습니다. 작업을 생성하고 예약하는 두 가지 주요 방법은 다음과 같습니다.

    • 고수준 API를 사용하여 작업 생성(권장)

    • 저수준 API를 사용하여 작업 생성

    2.1. API

    asyncio.create_task() 함수를 사용하여 작업을 생성할 수 있습니다. asyncio.create_task() 함수는 코루틴 인스턴스와 선택적 작업 이름을 받아들이고 asyncio.Task 인스턴스를 반환합니다.

    ...
    # create a coroutine
    coro = task_coroutine()
    # create a task from a coroutine
    task = asyncio.create_task(coro)

    이는 한 줄에 복합문을 사용하여 달성할 수 있습니다.

    ...
    # create a task from a coroutine
    task = asyncio.create_task(task_coroutine())

    이 작업은 몇 가지 작업을 수행합니다.

    • 코루틴을 비동기 작업 인스턴스로 래핑합니다.

    • 현재 이벤트 루프에서 실행될 작업을 예약합니다.

    • 작업 인스턴스를 반환합니다.

    작업 인스턴스는 삭제되고 메서드를 통해 상호 작용하며 코루틴에서 대기할 수 있습니다. 이는 asyncio 프로그램의 코루틴에서 작업을 생성하는 데 선호되는 방법입니다.

    2.2. 저수준 API

    저수준 asyncio API를 사용하여 코루틴에서 작업을 생성할 수도 있습니다.

    첫 번째 방법은 asyncio.ensure_future() 함수를 사용하는 것입니다. 이 함수는 작업, 미래 또는 코루틴과 같은 미래형 객체를 취하고 선택적으로 이를 예약하기 위한 루프를 사용합니다. 루프가 제공되지 않으면 현재 이벤트 루프에 예약됩니다.

    이 함수에 코루틴이 제공되면 인스턴스에 래핑된 다음 반환됩니다.

    ...
    # create and schedule the task
    task = asyncio.ensure_future(task_coroutine())

    작업을 생성하고 예약하는 데 사용할 수 있는 또 다른 하위 수준 함수는 loop.create_task() 메서드입니다. 이 함수를 사용하려면 코루틴이 작업으로 실행되는 특정 이벤트 루프에 액세스해야 합니다.

    asyncio.get_event_loop() 함수를 통해 asyncio 프로그램에서 현재 이벤트 루프 인스턴스를 가져올 수 있습니다. 그런 다음 create_task() 메서드를 호출하여 Task 인스턴스를 생성하고 실행을 예약하는 데 사용할 수 있습니다.

    ...
    # get the current event loop
    loop = asyncio.get_event_loop()
    # create and schedule the task
    task = loop.create_task(task_coroutine())

    3. 작업은 언제 실행되나요?

    작업을 생성한 후 자주 묻는 질문은 언제 실행되나요?

    create_task() 함수를 통해 코루틴이 작업으로 독립적으로 실행되도록 예약할 수 있지만 즉시 실행되지 않을 수 있습니다. 실제로 이벤트 루프가 실행될 때까지 작업은 실행되지 않습니다.

    이것은 다른 모든 코루틴이 실행되지 않고 작업이 실행될 차례가 될 때까지 발생하지 않습니다.

    예를 들어 작업을 생성하고 예약하는 코루틴이 있는 asyncio 프로그램이 있는 경우 작업을 생성한 호출 코루틴이 일시 중지될 때까지 예약된 작업은 실행되지 않습니다.

    호출하는 코루틴이 절전 모드를 선택하거나, 다른 코루틴이나 작업을 기다리거나, 예약된 새 작업을 기다리기로 선택하면 이런 일이 발생할 수 있습니다.

    ...
    # create a task from a coroutine
    task = asyncio.create_task(task_coroutine())
    # await the task, allowing it to run
    await task

    이제 우리는 작업이 무엇인지, 어떻게 예약하는지 알았습니다.

    위 내용은 Python에서 비동기 작업을 생성하고 실행하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제