线程内的FastAPI协程或协程内的线程

问题描述 投票:0回答:2

我正在编写一个FastAPI应用程序,对于给定的路径操作,我需要调用两个函数:一个是支持

async
的IO操作(我们称之为函数
A
),另一个是支持async
的IO操作(我们称之为函数
B
)。它们需要按顺序调用,并且在此期间需要发生一些其他
not IO操作。我想我有以下选择:

  1. async
     定义路径操作并照常调用 
    A
    ,然后 
    await
     B.
  2. 使用
  3. async
     定义路径操作,在线程池中运行 
    B
    (例如 
    fastapi.concurrency.run_in_threadpool
    ),然后运行 
    await
     B.
  4. 定义路径操作
  5. without async
    ,照常调用 
    A
    ,然后使用事件循环中的 
    B
     调用 
    run_until_complete
我想知道就性能速度而言最好的选择是什么。我确信在给出明确的结论之前可能有很多微妙的细节需要弄清楚,比如函数

A

B
 的确切实现。然而,我希望我能够对这种情况下发生的情况以及如果我无力运行基准来实现可能的精确实现时一般该怎么做有一些一般性的了解。

python python-asyncio fastapi python-multithreading
2个回答
0
投票
我认为选项 1 在性能和代码简单性方面通常是更好的方法。它允许您处理同步和异步操作,而不会进一步复杂化。但是,如果函数 A 是主要性能瓶颈,您可以考虑对函数 A 使用选项 2。


0
投票
选项 2 在性能方面应该更快,因为它是函数

A

 不会阻塞路径协程的唯一选项,并且函数 
B
 可以与函数 
A
 同时执行(因为两者都是 I/O 绑定任务) ).

注意:您问题的选项 2 中可能有拼写错误,意思是 -> .. 在线程池中运行

A

 ..

© www.soinside.com 2019 - 2024. All rights reserved.