sách gpt4 ai đã đi

Làm cho mã xử lý tệp tương thích với asyncio

In lại 作者:行者123 更新时间:2023-11-28 16:33:11 30 4
mua khóa gpt4 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 而不是与它一起工作。

1 Câu trả lời

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

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

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

30 4 0
Bài viết được đề xuất: c# - 使用 javascript/jQuery 回发
Bài viết được đề xuất: CSS 给容器上色
Bài viết được đề xuất: python - python 中的 docopt 给我带来了问题
Bài viết được đề xuất: python - 使用一个字典作为另一个python字典的组合键(键值对)
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com