gpt4 book ai didi

python - 如何正确使用 asyncio run_coroutine_threadsafe 函数?

转载 作者:行者123 更新时间:2023-12-03 12:43:52 35 4
gpt4 key购买 nike

我正在尝试了解 asyncio 模块并使用 run_coroutine_threadsafe 函数花费大约一个小时,我什至来到了工作示例,它按预期工作,但有几个限制。

首先,我不明白我应该如何在主(任何其他)线程中正确调用 asyncio 循环,在示例中我用 run_until_complete 调用它并给它一个协程让它忙于一些事情,直到另一个线程不会给它一个协程。我还有哪些其他选择?

在现实生活中我必须混合 asyncio 和线程(在 Python 中)的情况是什么?因为据我了解,asyncio 应该代替 Python 中的线程(由于 GIL 不是 IO 操作),如果我错了,请不要生气并分享您的建议。

Python 版本为 3.7/3.8

import asyncio
import threading
import time


async def coro_func():
return await asyncio.sleep(3, 42)


def another_thread(_loop):
coro = coro_func() # is local thread coroutine which we would like to run in another thread

# _loop is a loop which was created in another thread

future = asyncio.run_coroutine_threadsafe(coro, _loop)
print(f"{threading.current_thread().name}: {future.result()}")
time.sleep(15)
print(f"{threading.current_thread().name} is Finished")


if __name__ == '__main__':
loop = asyncio.get_event_loop()
main_th_cor = asyncio.sleep(10)
# main_th_cor is used to make loop busy with something until another_thread will not send coroutine to it
print("START MAIN")
x = threading.Thread(target=another_thread, args=(loop, ), name="Some_Thread")
x.start()
time.sleep(1)
loop.run_until_complete(main_th_cor)
print("FINISH MAIN")

最佳答案

First of all I do not understand how should I properly call asyncio loop in main (any other) thread, in the example I call it with run_until_complete and give it a coroutine to make it busy with something until another thread will not give it a coroutine. What are other options I have?



这是 loop.run_forever() 的一个很好的用例.循环将运行并为您使用 run_coroutine_threadsafe 提交的协程提供服务。 . (您甚至可以从多个线程并行提交此类协程;您永远不需要实例化多个事件循环。)

您可以通过调用 loop.call_soon_threadsafe(loop.stop) 从不同的线程停止循环。 .

What are situations when I have to mix asyncio and threading (in Python) in real life?



理想情况下应该没有。但在现实世界中,它们确实会出现;例如:
  • 当您将 asyncio 引入使用线程和阻塞调用且无法一次全部转换为 asyncio 的现有大型程序时。 run_coroutine_threadsafe允许常规阻塞代码使用 asyncio。
  • 当您处理旧的“异步”API 时,这些 API 在后台使用线程并从其他线程调用用户提供的 API。例子很多,比如Python自己的multiprocessing .
  • 当您需要从 asyncio 调用没有异步等效项的阻塞函数时 - 例如受 CPU 限制的函数、遗留数据库驱动程序等。这不是 run_coroutine_threadsafe 的用例, 在这里你会使用 run_in_executor ,但它是混合线程和 asyncio 的另一个示例。
  • 关于python - 如何正确使用 asyncio run_coroutine_threadsafe 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60113143/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com