asyncio - how many coroutines?

2024-05-19 19:18:38 发布

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

我已经为一个python应用程序苦苦挣扎了几天,我希望在一个文件夹中查找一个或多个文件,并遍历其中的每个文件和每个记录,并创建对象以在Janusgraph数据库中持久化。我正在使用的特定OGM要求使用asyncial异步地完成与数据库的事务。我读过很多关于asyncio的博客和帖子,我想我了解async、await、tasks等的概念。。。在我的应用程序中,我定义了几个处理不同部分的函数:

  • 检索所有可用文件的列表
  • 选择一个文件进行处理
  • 迭代选定的文件并读取要处理的行/记录
  • 接收记录,确定从中解析,并调用几个其他函数,这些函数负责在将模型对象持久化到数据库之前创建这些对象。例如,我创建了不同的函数:用户、会话、浏览器、设备使用、服务器等。。。在

我知道(我可能是错的)使用asyncio的最大优点是在对函数的调用通常会因I/O、数据库事务、网络延迟等原因而阻塞的情况下使用。。。在

所以我的问题是,我是否需要将所有的函数转换成协程和调度来运行整个事件循环,或者只转换那些会阻塞的函数,比如将事务提交到数据库。我一开始就尝试过这种方法,但遇到了各种各样的问题。在


Tags: 文件对象函数文件夹asyncio数据库应用程序async
1条回答
网友
1楼 · 发布于 2024-05-19 19:18:38

So my question is if I need to convert all my functions into coroutines and schedule to run through the event loop, or just the ones that would block,

您可能需要转换它们中的大多数,但转换应该是机械的,简单地说就是将def更改为{},并在调用其他协程时添加{}。在

显然,您无法避免转换实际阻塞的那些,或者切换到适当的asynciapi,或者对没有asynciapi的那些使用^{}。(DNS解析曾经是后者的一个突出例子。)

但是,您还需要转换它们的调用者,因为除非函数实现类似事件循环的功能,否则从阻塞函数调用协同例程是没有用的。另一方面,当一个协程从另一个协程被调用时,一切正常,因为挂起会自动传播到链的顶部。一旦整个调用链由协程组成,则使用^{}^{}将顶级调用链送入事件循环。在

当然,既不阻塞也不调用阻塞函数的便利函数可以安全地保持非异步,并且由同步或异步代码调用而没有任何区别。在


上面的内容适用于asyncio,它实现了无堆栈协程。greenlet使用了另一种方法,它的任务封装了调用堆栈,允许它们在使用普通函数调用的代码中的任意位置进行切换。不过,Greenlets比协同程序更重一些,也不太便于移植,所以我首先要转换成asyncio。

相关问题 更多 >