我已经为一个python应用程序苦苦挣扎了几天,我希望在一个文件夹中查找一个或多个文件,并遍历其中的每个文件和每个记录,并创建对象以在Janusgraph数据库中持久化。我正在使用的特定OGM要求使用asyncial异步地完成与数据库的事务。我读过很多关于asyncio的博客和帖子,我想我了解async、await、tasks等的概念。。。在我的应用程序中,我定义了几个处理不同部分的函数:
我知道(我可能是错的)使用asyncio的最大优点是在对函数的调用通常会因I/O、数据库事务、网络延迟等原因而阻塞的情况下使用。。。在
所以我的问题是,我是否需要将所有的函数转换成协程和调度来运行整个事件循环,或者只转换那些会阻塞的函数,比如将事务提交到数据库。我一开始就尝试过这种方法,但遇到了各种各样的问题。在
您可能需要转换它们中的大多数,但转换应该是机械的,简单地说就是将},并在调用其他协程时添加{}。在
def
更改为{显然,您无法避免转换实际阻塞的那些,或者切换到适当的asynciapi,或者对没有asynciapi的那些使用^{} 。(DNS解析曾经是后者的一个突出例子。)
但是,您还需要转换它们的调用者,因为除非函数实现类似事件循环的功能,否则从阻塞函数调用协同例程是没有用的。另一方面,当一个协程从另一个协程被调用时,一切正常,因为挂起会自动传播到链的顶部。一旦整个调用链由协程组成,则使用^{} 或^{} 将顶级调用链送入事件循环。在
当然,既不阻塞也不调用阻塞函数的便利函数可以安全地保持非异步,并且由同步或异步代码调用而没有任何区别。在
上面的内容适用于asyncio,它实现了无堆栈协程。greenlet使用了另一种方法,它的任务封装了调用堆栈,允许它们在使用普通函数调用的代码中的任意位置进行切换。不过,Greenlets比协同程序更重一些,也不太便于移植,所以我首先要转换成asyncio。
相关问题 更多 >
编程相关推荐