Spyder是如何在同一线程的后台运行asyncio事件循环的(或者它是如何运行的?)

2024-09-26 22:43:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经研究了几天asyncio模块/功能,因为我想将其用于我的应用程序的IO绑定部分,我认为我现在已经对它的工作原理有了合理的理解,或者至少我认为我已经理解了以下内容:

  1. 一次只能在任何线程中运行一个asyncio事件循环
  2. 一旦一切都设置好并准备就绪,就可以循环。永远运行_()或循环。运行_直到调用_complete()来运行循环,并且此调用将永久阻止线程或直到循环完成,即,没有同步代码可以(或应该)在同一线程中与事件循环并行运行
  3. 如果您需要从事件循环内部运行阻塞/非确定性同步代码,那么您应该在“执行器”内部运行它,该执行器(如果我的理解正确的话)在事件循环内部嵌入线程或进程池,并在那里运行代码(在它自己的新线程或进程中?)
  4. python的开发人员从未打算将异步代码和同步代码作为同一个应用程序的一部分,因为我完全找不到解释如何最好地实现线程间/同步间/异步代码通信的参考资料
  5. Asyncio不是为人类编写的

基于以上考虑,我一直在努力思考如何在后台运行我的异步代码,同时在前台执行其他(同步)工作,我也在谷歌上搜索了很多,发现很多人有同样的问题,但没有多少人有好的解决方案,而不是任何我满意的解决方案

所以现在我的问题是;Spyder IDE是如何做到的?

我正在使用Spyder IDE,发现Spyder运行自己的asyncio事件循环,不仅如此,您还可以直接在交互式python控制台中定义和运行异步函数,只需执行以下操作:

In [1]: async def my_printer():
   ...:     print('hello world')
   ...:
In [2]: asyncio.run_coroutine_threadsafe(my_printer(), asyncio.get_event_loop())
hello world

所以我想“我想知道我在Spyder终端中键入的代码实际上是在哪个线程中执行的”,所以我试着:

In [3]: import threading
In [4]: threading.current_thread()
<_MainThread(MainThread, started 9756)>

…然后当我尝试时,我的困惑变得更大

In [5]: async def get_thread():
   ...:     return threading.current_thread()
   ...:
In [6]: res = asyncio.run_coroutine_threadsafe(get_thread(), asyncio.get_event_loop())
In [7]: res.result()
<_MainThread(MainThread, started 9756)>

这到底是怎么回事

我不明白Spyder如何在主线程中运行asyncio事件循环,同时仍然允许我在同一线程中运行同步代码。我的理解是否不正确/我是否遗漏了异步IO的工作原理?还是Spyder在幕后雇佣了一些邪恶的黑客使其工作

我主要对此感兴趣,因为我希望它能帮助我理解同步和异步代码是如何协同工作的,因为它可能会进一步加深我对异步IO的理解


Tags: 代码inioasyncio应用程序get进程事件

热门问题