> 백엔드 개발 > 파이썬 튜토리얼 > Python에서 현재 및 실행 중인 작업을 비동기식으로 가져오는 방법

Python에서 현재 및 실행 중인 작업을 비동기식으로 가져오는 방법

PHPz
풀어 주다: 2023-05-12 14:43:17
앞으로
1538명이 탐색했습니다.

正文

我们可以反省在 asyncio 事件循环中运行的任务。这可以通过为当前运行的任务和所有正在运行的任务获取一个 asyncio.Task 对象来实现。

1. 如何获取当前任务

我们可以通过 asyncio.current_task() 函数获取当前任务。此函数将为当前正在运行的任务返回一个任务对象。

...
# get the current task
task = asyncio.current_task()
로그인 후 복사
  • 传递给 asyncio.run() 的主协程。

  • 通过 asyncio.create_task() 在 asyncio 程序中创建和调度的任务。

一个任务可以创建并运行另一个协程(例如,不包含在任务中)。从协程中获取当前任务将为正在运行的任务返回一个 Task 对象,但不会返回当前正在运行的协程。

如果协程或任务需要有关自身的详细信息,例如用于日志记录的任务名称,则获取当前任务会很有帮助。

我们可以探索如何为用于启动 asyncio 程序的主协程获取 Task 实例。下面的示例定义了一个用作程序入口点的协程。它报告一条消息,然后获取当前任务并报告其详细信息。

这是第一个重要的示例,因为它强调所有协程都可以作为异步事件循环中的任务进行访问。

下面列出了完整的示例。

# SuperFastPython.com
# example of getting the current task from the main coroutine
import asyncio
# define a main coroutine
async def main():
    # report a message
    print('main coroutine started')
    # get the current task
    task = asyncio.current_task()
    # report its details
    print(task)
# start the asyncio program
asyncio.run(main())
로그인 후 복사

运行该示例首先创建主协程并使用它来启动 asyncio 程序。main() 协程运行并首先报告一条消息。

然后它检索当前任务,这是一个代表自身的任务对象,即当前正在运行的协程。然后它会报告当前正在运行的任务的详细信息。

我们可以看到该任务具有第一个任务的默认名称“Task-1”,并且正在执行 main() 协程,即当前正在运行的协程。

这突出表明我们可以使用 asyncio.current_task() 函数来访问当前正在运行的协程的任务对象,该对象自动包装在任务对象中。

main coroutine started
<Task pending name=&#39;Task-1&#39; coro=<main() running at ...> cb=[_run_until_complete_cb() at ...]>
로그인 후 복사

2. 如何获取所有任务

我们可能需要访问异步程序中的所有任务。这可能有很多原因,例如:

  • 反省程序的当前状态或复杂性。

  • 记录所有正在运行的任务的详细信息。

  • 查找可以查询或取消的任务。

我们可以通过 asyncio.all_tasks() 函数在 asyncio 程序中获取一组所有已计划和正在运行(尚未完成)的任务。

...
# get all tasks
tasks = asyncio.all_tasks()
로그인 후 복사

这将返回 asyncio 程序中所有任务的集合。它是一个集合,因此每个任务只代表一次。

如果出现以下情况,将包括一项任务:

  • 任务已安排但尚未运行。

  • 该任务当前正在运行(例如,但当前已暂停)

该集合还将包括当前正在运行的任务的任务,例如正在执行调用 asyncio.all_tasks() 函数的协程的任务。

另外,回想一下用于启动 asyncio 程序的 asyncio.run() 方法会将提供的协程包装在任务中。这意味着所有任务的集合将包括程序入口点的任务。

我们可以探索在一个 asyncio 程序中有很多任务的情况,然后得到一组所有任务。

在此示例中,我们首先创建 10 个任务,每个任务包装并运行相同的协程。主协程然后获取程序中计划或运行的所有任务的集合并报告它们的详细信息。

下面列出了完整的示例。

# SuperFastPython.com
# example of starting many tasks and getting access to all tasks
import asyncio
# coroutine for a task
async def task_coroutine(value):
    # report a message
    print(f&#39;task {value} is running&#39;)
    # block for a moment
    await asyncio.sleep(1)
# define a main coroutine
async def main():
    # report a message
    print(&#39;main coroutine started&#39;)
    # start many tasks
    started_tasks = [asyncio.create_task(task_coroutine(i)) for i in range(10)]
    # allow some of the tasks time to start
    await asyncio.sleep(0.1)
    # get all tasks
    tasks = asyncio.all_tasks()
    # report all tasks
    for task in tasks:
        print(f&#39;&gt; {task.get_name()}, {task.get_coro()}&#39;)
    # wait for all tasks to complete
    for task in started_tasks:
        await task
# start the asyncio program
asyncio.run(main())
로그인 후 복사

运行该示例首先创建主协程并使用它来启动 asyncio 程序。main() 协程运行并首先报告一条消息。然后它创建并安排 10 个包装自定义协程的任务。然后 main() 协程会阻塞片刻以允许任务开始运行。任务开始运行,每个任务报告一条消息,然后休眠。

main() 协程恢复并获取程序中所有任务的列表。然后它报告每个的名称和协程。最后,它枚举已创建的任务列表并等待每个任务完成。

这突出表明我们可以获得 asyncio 程序中所有任务的集合,其中包括创建的任务以及代表程序入口点的任务。

메인 코루틴 시작됨
작업 0 실행 중
작업 1 실행 중
작업 2 실행 중
작업 3 실행 중
작업 4 실행 중
작업 5 실행 중
작업 6 실행 중
작업 7 실행 중
작업 8 실행 중
작업 9가 실행 중입니다
> Task-9, <0x10e186e30의 코루틴 객체 task_coroutine>
> 작업-2, <0x10e184e40의 코루틴 객체 task_coroutine>
> Task-11, <0x10e186f10의 코루틴 객체 task_coroutine>
> 작업-7, <0x10e186d50의 코루틴 객체 task_coroutine>
> 작업-4, <0x10e185700의 코루틴 객체 task_coroutine>
> Task-10, <0x10e186ea0의 코루틴 객체 task_coroutine>
> Task-8, <0x10e186dc0의 코루틴 객체 task_coroutine>
> 작업-5, <0x10e186ab0의 코루틴 객체 task_coroutine>
> 작업-1, <0x10e1847b0의 메인 코루틴 객체>
> 작업-3, <0x10e184f90의 코루틴 객체 task_coroutine>
> 작업-6, <0x10e186ce0의 코루틴 객체 task_coroutine>

接下来,我们将探讨如何同时运行多个协程。

위 내용은 Python에서 현재 및 실행 중인 작업을 비동기식으로 가져오는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿