Python的asyncio协同路由能否并发地运行到调用方?

2024-04-20 03:02:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道asyncio.gather,它“批处理”几个协同程序。但那不是我要找的

我正在寻找一种方法来对调用方同时运行一个协程X,在运行协程X时做一些其他工作,然后回来从协程X获取结果

在C#中,我们可以执行以下操作:

using System;
using System.Threading.Tasks;
using System.Threading;

namespace demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Task<int> task = DoWork(); // run **Concurrently**

            System.Console.WriteLine("Do something else in Main");
            Thread.Sleep(3000); // Do something else

            // Come back to it:
            var result = task.Result;
            System.Console.WriteLine($"Result is {result}");
        }

        static async Task<int> DoWork()
        {
            System.Console.WriteLine("Running DoWork...");
            await Task.Delay(2000);
            System.Console.WriteLine("DoWork is done.");
            return 1;
        }
    }
}

结果是

>>> dotnet run
Running DoWork...
Do something else in Main
DoWork is done.
Result is 1

注意:在上面的示例中,我们可以将Main更改为async Task MainAsync(),然后只需要将int result = task.Result;更改为int result = await task;。我的观点仍然是

Python asyncio中是否存在等价性

更新这个问题不是重复的-run_in_executor采用传统的python函数并将其调度到线程池或进程池执行器上以实现并发。但是,我特别要求安排一个异步函数(coroutine)。关键是我仍然可以在coroutine中使用await进行同步。因此,让我重复一下我的问题:如何使用asyncio并发地运行异步函数(即协程)


Tags: runasynciotaskismainresultsystemconsole