gevent.fileobject
--包装器使类似文件的对象协作#
包装器,使类似文件的对象协同工作。
- class FileObject(fobj, mode='r', buffering=-1, closefd=True, encoding=None, errors=None, newline=None)#
主要入口指向类似于gevent兼容行为的文件。它将被定义为可用的最佳实现。
所有参数与
io.open()
.- 参数:
fobj -- 通常是套接字的文件描述符。也可以是另一个具有
fileno()
方法,或可以传递给io.open()
(例如,文件系统路径)。如果对象不是套接字,则结果将因平台和打开的对象类型而异。所有支持的Python版本都允许os.PathLike
物体。
在 1.5 版本发生变更: 接受str和
PathLike
对象为 fobj 在所有版本的Python上。在 1.5 版本发生变更: 添加 编码 , 错误 和 换行符 争论。
在 1.5 版本发生变更: 接受 特洛夫德 和 缓冲 而不是 关闭 和 蟾蜍尺码 论据。后者保留为向后兼容。
有两个主要的实现 FileObject
. 在所有系统中,都有 FileObjectThread
它使用内置的本机线程池来避免阻塞整个解释器。在Unix系统上(那些支持 fcntl
模块),还有 FileObjectPosix
它使用本机非阻塞语义。
三等舱, FileObjectBlock
,只是一个同步执行所有内容的包装器(因此不兼容gevent)。它用于测试和调试。
所有类都有相同的签名;有些类可能接受额外的关键字参数。
配置#
您可以更改的默认值 FileObject
使用 GEVENT_FILE
环境变量。设置为 posix
, thread
或 block
从中选择 FileObjectPosix
, FileObjectThread
和 FileObjectBlock
,分别。您也可以将其设置为实现文件接口的另一个对象的完全限定类名,以使用您自己的对象之一。
备注
必须在首次导入此模块时设置环境变量。
Classes#
- FileObject#
FileObjectPosix
的别名
- class FileObjectPosix[源代码]#
基类:
FileObjectBase
一种类似文件的对象,对非阻塞文件进行操作,但提供同步、合作的接口。
小心
此对象只能有效地包装可用于
select.select()
比如插座和管道。一般来说,在大多数平台上,对常规文件的操作(例如,
open('a_file.txt')
)已经被认为是非阻塞的,尽管它们可能需要一些时间来完成,因为数据被复制到内核并刷新到磁盘上:不过,与套接字或管道相比,这一时间是相对有限的。一read()
或write()
对这样一个文件的调用在一小段时间内仍然会有效地阻塞。因此,将这个类包装在一个常规文件中不太可能使IO GEvent友好:读取或写入大量数据仍可能阻塞事件循环。如果您将使用常规文件并进行大块IO,则可以考虑使用
FileObjectThread
或tp_read()
和tp_write()
绕过这个问题。小技巧
尽管此对象提供
fileno()
方法及其自身可以传递给fcntl.fcntl()
,设置os.O_NONBLOCK
标志将不起作用(虽然其他greenlet可以运行,但读取操作仍会阻塞greenlet)。但是,删除该标志 会使这个目标不再合作 (其他绿叶树将不再运行)。你可以使用内部
fileio
此对象的属性(Aio.RawIOBase
)执行非阻塞字节读取。但是,请注意,一旦开始直接使用此属性,使用 this 对象未定义,特别是在文本模式下。(见 issue #222 )在 1.1 版本发生变更: 现在使用
io
在内部打包。在python 2下,以前使用了未记录的类socket._fileobject
. 这提供了更好的类文件语义(以及对Python3的可移植性)。在 1.2a1 版本发生变更: 文档
fileio
非阻塞读取的属性。在 1.2a1 版本发生变更: 写入模式下的bufsize 0不再强制为1。相反,底层缓冲区在每次写入操作后都会刷新,以模拟0的bufsize。在gevent 1.0中,写入换行时刷新bufsize 0,而在gevent 1.1中,写入多个字节时刷新bufsize。请注意,这可能会影响性能。
在 1.3a1 版本发生变更: 在python 2上,启用通用换行不再强制使用unicode IO。
在 1.5 版本发生变更: 的默认值 mode 已从
rb
至r
。这与以下内容是一致的open()
,io.open()
,以及FileObjectThread
,这是默认设置FileObject
在一些平台上。在 1.5 版本发生变更: 停止强制缓冲。以前,给定一个
buffering=0
论点, 缓冲 将设置为1,并且buffering=1
将被强制设置为默认缓冲区大小。这是一个长期存在的并发问题的变通方法。现在, 缓冲 参数被解释为预期的。
- class FileObjectThread[源代码]#
基类:
FileObjectBase
一个类似文件的对象,包装另一个类似文件的对象,在后台线程中对该对象执行所有阻塞操作。
小心
尝试更改现有FileObjectThread的线程池或锁会产生未定义的结果。
在 1.1b1 版本发生变更: 使用threadpool关闭文件对象。请注意,此操作是同步的还是异步的,没有记录在案。
- 参数:
lock (bool) -- 如果为真(默认值),则将逐个执行所有操作。请注意,这并不保证,如果从多个线程/greenlet使用这个文件对象,操作将以任何特定的顺序执行,只会同时尝试两个操作。你也可以通过自己的
gevent.lock.Semaphore
将文件操作与外部资源同步。closefd (bool) -- 如果为True(默认值),则当此对象关闭时,基础对象也将关闭。如果 fobj 是一条路,那么 特洛夫德 一定是真的。