Python asyncio:将 run_in_executor 与 ThreadPoolExecutor 结合使用时,是否需要共享变量的同步原语?

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

我正在使用Python的asyncio,并试图理解run_in_executor函数和默认的ThreadPoolExecutor来异步处理阻塞任务。我关心的是访问这些任务中的共享变量。

我的理解是:当我将 run_in_executor 与 ThreadPoolExecutor 一起使用时,任务在单独的线程中执行。因此,为了确保线程安全并防止竞争条件,我应该在访问共享变量时使用锁等同步原语,就像使用线程模块一样。

我的理解是否正确,或者 asyncio 在这种情况下处理共享变量是否有所不同?

python python-asyncio python-multithreading
1个回答
0
投票

是的,您的理解是正确的。具有 asyncio 事件循环的线程是与其他线程平等竞争的普通线程。另外,通过

run_in_executor()
启动的线程没有特殊的语义,这个方法只是作为一个包装器,以便您可以在线程执行后异步获取结果(或异常)。但有几点需要考虑:

  • 如果共享状态仅由执行同步函数的线程访问,请随意使用 threading 模块中的原语。
  • 如果共享状态也由异步函数访问,您可能需要不阻塞事件循环的线程安全原语,以便异步任务仍然可以并发运行。

但是,请注意,在“自由线程模式”下,线程可以真正并行执行。这就是为什么你不应该使用线程模块中的原语,除非你确定锁将被持有很短的时间:因此你可以限制异步任务的并发性。

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