【问题标题】:Does asyncio support running a subprocess from a non-main thread?asyncio 是否支持从非主线程运行子进程?
【发布时间】:2019-10-18 02:42:04
【问题描述】:

我正在开发一个主要由服务组成的应用程序,这些服务是具有自定义运行循环的线程。

其中一项服务需要产生子流程,我真的不明白它是否有效。官方documentation 模棱两可。即它在同一部分中同时显示asyncio supports running subprocesses from different threadsAn event loop must run in the main thread

如果事件循环必须在主线程中运行,怎么可能从不同的线程运行子进程?

【问题讨论】:

    标签: python python-3.x python-asyncio


    【解决方案1】:

    文档说:

    1. 您应该在主线程中运行事件循环。
    2. 在主线程中请在程序开始时调用asyncio.get_child_watcher()

    之后你可以从非主线程创建子进程。

    UPD

    从 Python 3.8 开始,asyncio 没有上述限制。

    一切都正常工作

    【讨论】:

    • 为什么我们仍然需要这个限制?我想避免占用主线程,因为它已经忙于 GUI 的事件外观(Qt)。
    • 当 asyncio 启动子进程时,它需要由 subproc 完成事件通知。不幸的是,在 Unix 系统中,通用的方法是捕获 SIG_CHLD 信号。 Python 解释器只能在主线程中处理信号。顺便说一句,您可以尝试使用 Quamash 在 Qt 上运行 asyncio eventloop。
    • 我会的,谢谢你的建议。如果没有 event_loop 的直接要求,是否可以隐式捕获信号?
    • 不,抱歉。如果没有足够深的异步重写,就无法实现隐式信号捕获。此外,信号的行为类似于单例:程序的每个部分都希望拥有对信号系统的独占访问权限,但库之间可能会相互冲突。
    • 在这种情况下 UPD 是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2011-08-03
    • 1970-01-01
    • 2020-02-10
    相关资源
    最近更新 更多