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 环境变量。设置为 posixthreadblock 从中选择 FileObjectPosixFileObjectThreadFileObjectBlock ,分别。您也可以将其设置为实现文件接口的另一个对象的完全限定类名,以使用您自己的对象之一。

备注

必须在首次导入此模块时设置环境变量。

Classes#

FileObject#

FileObjectPosix 的别名

class FileObjectBlock[源代码]#

基类:FileObjectBase

文件对象的简单同步包装。

不添加并发性或gevent兼容性。

class FileObjectPosix[源代码]#

基类:FileObjectBase

一种类似文件的对象,对非阻塞文件进行操作,但提供同步、合作的接口。

小心

此对象只能有效地包装可用于 select.select() 比如插座和管道。

一般来说,在大多数平台上,对常规文件的操作(例如, open('a_file.txt') )已经被认为是非阻塞的,尽管它们可能需要一些时间来完成,因为数据被复制到内核并刷新到磁盘上:不过,与套接字或管道相比,这一时间是相对有限的。一 read()write() 对这样一个文件的调用在一小段时间内仍然会有效地阻塞。因此,将这个类包装在一个常规文件中不太可能使IO GEvent友好:读取或写入大量数据仍可能阻塞事件循环。

如果您将使用常规文件并进行大块IO,则可以考虑使用 FileObjectThreadtp_read()tp_write() 绕过这个问题。

小技巧

尽管此对象提供 fileno() 方法及其自身可以传递给 fcntl.fcntl() ,设置 os.O_NONBLOCK 标志将不起作用(虽然其他greenlet可以运行,但读取操作仍会阻塞greenlet)。但是,删除该标志 会使这个目标不再合作 (其他绿叶树将不再运行)。

你可以使用内部 fileio 此对象的属性(A io.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 已从 rbr 。这与以下内容是一致的 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 是一条路,那么 特洛夫德 一定是真的。