[英]How to set timeout for tornado IOStream?
如何設置龍卷風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()
等,但它的這種做法與龍卷風整合的痛苦。
我已經成功地使用gen.with_timeout
和骯臟的hack來清除超時狀態,從而執行讀取操作。
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)
祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.