【问题标题】:What are the use cases for `asyncio.new_event_loop`?`asyncio.new_event_loop` 的用例是什么?
【发布时间】:2020-01-21 19:32:48
【问题描述】:

我意识到new_event_loop 是由get_event_loop 调用的,如果循环尚不存在 - 我想知道除了典型的get_event_loop 之外或代替典型的get_event_loop,是否有理由调用new_event_loop

看来new_event_loop 可以用来:

  1. 在单个应用程序中有多个事件循环。
  2. 在一个被杀死后创建一个新的事件循环。

不过,我想不出这样做的充分理由。你们有没有遇到过显式调用new_event_loop 的用例?

【问题讨论】:

    标签: python asynchronous web python-asyncio


    【解决方案1】:

    显式事件循环创建主要用于两种情况:

    • 您需要在主线程之外运行事件循环。这是文档的内容:

    默认策略将上下文定义为当前线程,并为每个与 asyncio 交互的线程管理一个事件循环。如果当前线程还没有与之关联的事件循环,则默认策略的 get_event_loop() 方法会在从主线程调用时创建一个,否则会引发 RuntimeError

    • 您想在单个应用程序中使用自定义策略(例如,使用同一应用程序支持不同平台的不同实现)。您可以阅读政策here

    如果要更改默认事件循环类型,基本上需要策略。

    【讨论】:

    • 您的第二点对我来说很有意义,但我想知道是否有充分的理由在不同的线程中产生事件循环。我想你可以通过在多个进程中使用事件循环来加快速度
    • @Battery_Al 在后台线程中生成事件循环是将 asyncio 集成到现有的非平凡代码库中的好方法,该代码库不能一次从下往上进行异步。这样您就可以使用asyncio.run_coroutine_threadsafe 将工作提交到事件循环,并在等待结果时阻塞(当前线程)。
    • 感谢@user4815162342!很高兴知道
    • 我正在这样做。但我使用的是self.root_task = self.loop.create_task(self.my_aio_run()),然后是self.loop.run_until_complete(self.root_task)。有什么理由更喜欢asyncio.run_coroutine_threadsafe
    猜你喜欢
    • 2016-06-22
    • 2010-10-09
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2021-08-21
    • 2011-03-31
    相关资源
    最近更新 更多