tornado.iostream ---无堵塞插座方便包装¶
用于写入和读取非阻塞文件和套接字的实用程序类。
内容:
BaseIOStream:用于读写的通用接口。IOStream:使用非阻塞套接字实现baseiostream。SSLIOStream:支持SSL的iostream版本。PipeIOStream:基于管道的iostream实现。
基类¶
- class tornado.iostream.BaseIOStream(max_buffer_size: Optional[int] = None, read_chunk_size: Optional[int] = None, max_write_buffer_size: Optional[int] = None)[源代码]¶
用于写入和读取非阻塞文件或套接字的实用程序类。
我们支持非阻塞
write()和一个家庭read_*()方法。当操作完成时,Awaitable将通过读取数据来解决(或None对于write())所有杰出Awaitables将解决StreamClosedError当水流关闭时;BaseIOStream.set_close_callback也可用于通知关闭的流。当流因错误而关闭时,iostream的
error属性包含异常对象。子类必须实现
fileno,close_fd,write_to_fd,read_from_fd,并且可以选择get_fd_error.BaseIOStream建造师。- 参数
max_buffer_size -- 进入缓冲区的最大数据量;默认为100MB。
read_chunk_size -- 一次从基础传输读取的数据量;默认值为64KB。
max_write_buffer_size -- 发送到缓冲区的数据量;默认为无限制。
在 4.0 版更改: 添加
max_write_buffer_size参数。更改的默认值read_chunk_size到64KB。在 5.0 版更改: 这个
io_loop已删除参数(自4.1版以来已弃用)。
主界面¶
- BaseIOStream.write(data: Union[bytes, memoryview]) Future[None][源代码]¶
异步将给定数据写入此流。
此方法返回
Future解决(结果是None)当写入完成时。这个
data参数的类型不能为bytes或memoryview.在 4.0 版更改: 现在返回
Future如果没有回调。在 4.5 版更改: 为添加了支持
memoryview参数。在 6.0 版更改: 这个
callback参数已删除。使用返回的Future相反。
- BaseIOStream.read_bytes(num_bytes: int, partial: bool = False) Awaitable[bytes][源代码]¶
异步读取若干字节。
如果
partial是真的,一旦我们有任何字节要返回,就返回数据(但不会超过num_bytes)在 4.0 版更改: 增加了
partial参数。回调参数现在是可选的,并且Future如果省略,则返回。在 6.0 版更改: 这个
callback和streaming_callback参数已删除。使用返回的Future(和partial=True对于streaming_callback相反。
- BaseIOStream.read_into(buf: bytearray, partial: bool = False) Awaitable[int][源代码]¶
异步读取若干字节。
buf必须是可写缓冲区,数据将被读取到该缓冲区中。如果
partial如果为真,则在读取任何字节后立即运行回调。否则,当buf已完全填充了读取数据。5.0 新版功能.
在 6.0 版更改: 这个
callback参数已删除。使用返回的Future相反。
- BaseIOStream.read_until(delimiter: bytes, max_bytes: Optional[int] = None) Awaitable[bytes][源代码]¶
异步读取,直到找到给定的分隔符。
结果包括所有读取的数据,包括分隔符。
如果
max_bytes不是“无”,如果超过max_bytes已读取个字节,但找不到分隔符。在 4.0 版更改: 增加了
max_bytes参数。这个callback参数现在是可选的,并且Future如果省略,则返回。在 6.0 版更改: 这个
callback参数已删除。使用返回的Future相反。
- BaseIOStream.read_until_regex(regex: bytes, max_bytes: Optional[int] = None) Awaitable[bytes][源代码]¶
异步读取,直到我们匹配给定的regex。
结果包括与regex匹配的数据以及之前的所有数据。
如果
max_bytes不是“无”,如果超过max_bytes已读取个字节,但不满足regex。在 4.0 版更改: 增加了
max_bytes参数。这个callback参数现在是可选的,并且Future如果省略,则返回。在 6.0 版更改: 这个
callback参数已删除。使用返回的Future相反。
- BaseIOStream.read_until_close() Awaitable[bytes][源代码]¶
异步读取套接字中的所有数据,直到它关闭为止。
这将缓冲所有可用数据,直到
max_buffer_size达到。如果需要流量控制或取消,请使用read_bytes(partial=True)相反。在 4.0 版更改: 回调参数现在是可选的,并且
Future如果省略,则返回。在 6.0 版更改: 这个
callback和streaming_callback参数已删除。使用返回的Future(和read_bytes具有partial=True对于streaming_callback相反。
- BaseIOStream.close(exc_info: Union[None, bool, BaseException, Tuple[Optional[Type[BaseException]], Optional[BaseException], Optional[types.TracebackType]]] = False) None[源代码]¶
关闭此流。
如果
exc_info是真的,设置error当前异常的属性来自sys.exc_info(或)exc_info是一个元组,使用它而不是sys.exc_info)
子类方法¶
- BaseIOStream.close_fd() None[源代码]¶
关闭此流的基础文件。
close_fd被称为BaseIOStream不应在其他地方调用;其他用户应调用close相反。
- BaseIOStream.write_to_fd(data: memoryview) int[源代码]¶
尝试写入
data到基础文件。返回写入的字节数。
- BaseIOStream.read_from_fd(buf: Union[bytearray, memoryview]) Optional[int][源代码]¶
尝试读取基础文件。
读到
len(buf)字节,存储在缓冲区中。返回读取的字节数。如果没有要读取的内容(套接字返回EWOULDBLOCK或等效物),在EOF上为零。在 5.0 版更改: 重新设计的接口接受缓冲区并返回大量字节,而不是新分配的对象。
启动位置¶
- class tornado.iostream.IOStream(socket: socket.socket, *args: Any, **kwargs: Any)[源代码]¶
基于套接字的
IOStream实施。此类支持
BaseIOStream加一connect方法。这个
socket参数可以是连接的,也可以是未连接的。对于服务器操作,套接字是调用socket.accept. 对于客户端操作,使用创建套接字socket.socket,并且可以在将其传递给IOStream或与IOStream.connect.使用此类的一个非常简单(且已损坏)的HTTP客户端:
import tornado.ioloop import tornado.iostream import socket async def main(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) stream = tornado.iostream.IOStream(s) await stream.connect(("friendfeed.com", 80)) await stream.write(b"GET / HTTP/1.0\r\nHost: friendfeed.com\r\n\r\n") header_data = await stream.read_until(b"\r\n\r\n") headers = {} for line in header_data.split(b"\r\n"): parts = line.split(b":") if len(parts) == 2: headers[parts[0].strip()] = parts[1].strip() body_data = await stream.read_bytes(int(headers[b"Content-Length"])) print(body_data) stream.close() if __name__ == '__main__': tornado.ioloop.IOLoop.current().run_sync(main) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) stream = tornado.iostream.IOStream(s) stream.connect(("friendfeed.com", 80), send_request) tornado.ioloop.IOLoop.current().start()
- connect(address: Any, server_hostname: Optional[str] = None) Future[_IOStreamType][源代码]¶
将套接字连接到远程地址而不阻塞。
仅当传递给构造函数的套接字以前未连接时才能调用。地址参数的格式与for相同
socket.connect对于传递给iostream构造函数的套接字类型,例如(ip, port)元组。此处接受主机名,但将同步解析并阻止IOLoop。如果您有主机名而不是IP地址,则TCPClient建议使用类,而不是直接调用此方法。TCPClient将执行异步DNS解析并处理IPv4和IPv6。如果
callback如果未指定,则在连接完成时将不带参数调用它;如果未指定,则此方法返回Future(成功连接后的结果将是流本身)。在SSL模式下,
server_hostname参数将用于证书验证(除非在ssl_options)和sni(如果支持;需要python 2.7.9+)。注意打电话是安全的
IOStream.write当连接挂起时,在这种情况下,数据将在连接就绪后立即写入。打电话IOStream在连接套接字之前读取方法在某些平台上工作,但不可移植。在 4.0 版更改: 如果未给出回调,则返回
Future.在 4.2 版更改: 默认情况下验证SSL证书;通过
ssl_options=dict(cert_reqs=ssl.CERT_NONE)或适当配置ssl.SSLContext到SSLIOStream要禁用的构造函数。在 6.0 版更改: 这个
callback参数已删除。使用返回的Future相反。
- start_tls(server_side: bool, ssl_options: Optional[Union[Dict[str, Any], ssl.SSLContext]] = None, server_hostname: Optional[str] = None) Awaitable[tornado.iostream.SSLIOStream][源代码]¶
转换此
IOStream对SSLIOStream.这将启用以明文模式开始并在某些初始协商(例如
STARTTLS对SMTP和IMAP的扩展)。如果流上有未完成的读或写操作,或者iostream的缓冲区中有任何数据(操作系统的套接字缓冲区中允许有数据),则不能使用此方法。这意味着它通常必须在读取或写入最后一个明文数据后立即使用。它还可以在连接之后、任何读或写之前立即使用。
这个
ssl_options参数可以是ssl.SSLContext对象或关键字参数字典ssl.wrap_socket功能。这个server_hostname参数将用于证书验证,除非在ssl_options.此方法返回
Future谁的结果是新的SSLIOStream. 调用此方法后,原始流上的任何其他操作都未定义。如果在此流上定义了关闭回调,它将被传输到新流。
4.0 新版功能.
在 4.2 版更改: 默认情况下验证SSL证书;通过
ssl_options=dict(cert_reqs=ssl.CERT_NONE)或适当配置ssl.SSLContext禁用。
- class tornado.iostream.SSLIOStream(*args: Any, **kwargs: Any)[源代码]¶
用于写入和读取非阻塞的SSL套接字的实用程序类。
如果传递给构造函数的套接字已连接,则应使用以下内容进行包装:
ssl.wrap_socket(sock, do_handshake_on_connect=False, **kwargs)
在构造
SSLIOStream. 未连接的插座将在IOStream.connect完成了。这个
ssl_options关键字参数可以是ssl.SSLContext对象或关键字字典参数ssl.wrap_socket- wait_for_handshake() Future[SSLIOStream][源代码]¶
等待初始SSL握手完成。
如果A
callback如果给定,则在握手完成后将不带参数调用它;否则,此方法将返回Future它将在握手完成后解析为流本身。一旦握手完成,就可以在上访问对等方的证书和NPN/ALPN选择等信息。
self.socket.此方法用于服务器端流或在使用之后
IOStream.start_tls;不应与IOStream.connect(已经等待握手完成)。每个流只能调用一次。4.2 新版功能.
在 6.0 版更改: 这个
callback参数已删除。使用返回的Future相反。
例外情况¶
- exception tornado.iostream.StreamClosedError(real_error: Optional[BaseException] = None)[源代码]¶
引发的异常
IOStream方法。请注意,关闭回调已计划运行 之后 流上的其他回调(允许处理缓冲数据),因此在看到关闭回调之前可能会看到此错误。
这个
real_error属性包含导致流关闭(如果有)的基础错误。在 4.3 版更改: 增加了
real_error属性。