Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何设置tornado IOStream的超时?_Python_Sockets_Tornado - Fatal编程技术网

Python 如何设置tornado IOStream的超时?

Python 如何设置tornado IOStream的超时?,python,sockets,tornado,Python,Sockets,Tornado,如何设置tornado IOStream的超时 我已尝试通过以下方式构建IOStream: sock = socket.socket() sock.settimeout(5) self.stream = tornado.iostream.IOStream(sock) 但是当我调用stream.read_bytes()时,它仍然会一直等待。您不能使用socket.settimeout(),因为它是为阻止IO而设计的,而Tornado提供了非阻止IO Tornado高度面向Web和HTTP IO,

如何设置tornado IOStream的超时

我已尝试通过以下方式构建IOStream:

sock = socket.socket()
sock.settimeout(5)
self.stream = tornado.iostream.IOStream(sock)

但是当我调用stream.read_bytes()时,它仍然会一直等待。

您不能使用
socket.settimeout()
,因为它是为阻止IO而设计的,而Tornado提供了非阻止IO

Tornado高度面向Web和HTTP IO,它不允许在没有极度痛苦的情况下进行低级网络编程(IOStream的来源非常可怕)

设置套接字超时的最佳方法是使用
select.select()
select.poll()
,等等,但是将这种方法与Tornado集成在一起是一种痛苦

我已经通过使用
gen.with\u timeout
和一个清除流状态的脏黑客的组合来执行超时读取

from tornado import gen
from tornado.ioloop import IOLoop
from tornado.tcpclient import TCPClient

timeout = 5
io_loop = IOLoop.current()
factory = TCPClient(io_loop=io_loop)

@gen.coroutine
def run():
    stream = yield factory.connect('127.0.0.1', 1234)
    try:
        future = stream.read_bytes(128)
        data = yield gen.with_timeout(
            timeout=io_loop.time() + timeout,
            future=future,
            io_loop=io_loop,
        )
    except gen.TimeoutError:
        # A dirty hack to cancel reading and to clear state of the stream, so
        # stream will be available for reading in future
        io_loop.remove_handler(stream.socket)
        state = (stream._state & ~io_loop.READ)
        stream._state = None
        stream._read_callback = None
        stream._read_future = None
        stream._add_io_state(state)
祝你好运