gpt4 book ai didi

python - 使文件处理代码与 asyncio 兼容

转载 作者:行者123 更新时间:2023-11-28 16:33:11 30 4
gpt4 key购买 nike

库接受文件输入的“传统”方式是做这样的事情:

def foo(file_obj):
data = file_obj.read()
# Do other things here

客户端代码负责打开文件,找到适当的点(如果需要),然后关闭它。如果客户想给我们一个管道或套接字(或 StringIO,就此而言),他们可以这样做,而且它就可以工作。

但这与 asyncio 不兼容,它需要更像这样的语法:

def foo(file_obj):
data = yield from file_obj.read()
# Do other things here

当然,这种语法只适用于 asyncio 对象;试图将它与传统文件对象一起使用会造成困惑。反之亦然。

更糟糕的是,在我看来,没有办法将这个 yield from 包装在传统的 .read() 方法中,因为我们需要一直 yield 到事件循环,而不仅仅是在读取发生的地方。 gevent 库确实做了类似的事情,但我不知道如何将他们的 greenlet 代码改编成生成器。

如果我正在编写一个处理文件输入的库,我应该如何处理这种情况?我需要两个版本的 foo() 函数吗?我有很多这样的功能;复制所有这些是不可扩展的。

我可以告诉我的客户开发人员使用 run_in_executor()或类似的东西,但这感觉就像是在对抗 asyncio 而不是与它一起工作。

最佳答案

这是显式异步框架的缺点之一。与 gevent 不同,它可以在不更改任何代码的情况下对同步代码进行 monkeypatch 使其成为异步代码,您不能在不重写同步代码以使用 asyncio 的情况下使同步代码与 asyncio 兼容.coroutineyield from(或至少 asyncio.Futures 和回调)一直向下。

据我所知,在 asyncio 和正常的同步上下文中都无法使相同的函数正常工作;任何兼容 asyncio 的代码都将依赖于运行的事件循环来驱动异步部分,因此它不会在正常上下文中工作,并且同步代码总是会以阻塞结束如果事件循环在 asyncio 上下文中运行。这就是为什么您通常会看到特定于 asyncio(或至少是特定于异步框架)的库版本以及同步版本。没有什么好的方法可以提供适用于两者的统一 API。

关于python - 使文件处理代码与 asyncio 兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29800104/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com