tornado.ioloop
— Main event loop¶
An I/O event loop for non-blocking sockets.
Typical applications will use a single IOLoop
object, in the
IOLoop.instance
singleton. The IOLoop.start
method should usually
be called at the end of the main()
function. Atypical applications may
use more than one IOLoop
, such as one IOLoop
per thread, or per unittest
case.
In addition to I/O events, the IOLoop
can also schedule time-based events.
IOLoop.add_timeout
is a non-blocking alternative to time.sleep
.
IOLoop objects¶
-
class
tornado.ioloop.
IOLoop
[源代码]¶ A level-triggered I/O loop.
We use
epoll
(Linux) orkqueue
(BSD and Mac OS X) if they are available, or else we fall back on select(). If you are implementing a system that needs to handle thousands of simultaneous connections, you should use a system that supports eitherepoll
orkqueue
.Example usage for a simple TCP server:
import errno import functools import tornado.ioloop import socket def connection_ready(sock, fd, events): while True: try: connection, address = sock.accept() except socket.error as e: if e.args[0] not in (errno.EWOULDBLOCK, errno.EAGAIN): raise return connection.setblocking(0) handle_connection(connection, address) if __name__ == '__main__': sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setblocking(0) sock.bind(("", port)) sock.listen(128) io_loop = tornado.ioloop.IOLoop.current() callback = functools.partial(connection_ready, sock) io_loop.add_handler(sock.fileno(), callback, io_loop.READ) io_loop.start()
By default, a newly-constructed
IOLoop
becomes the thread’s currentIOLoop
, unless there already is a currentIOLoop
. This behavior can be controlled with themake_current
argument to theIOLoop
constructor: ifmake_current=True
, the newIOLoop
will always try to become current and it raises an error if there is already a current instance. Ifmake_current=False
, the newIOLoop
will not try to become current.在 4.2 版更改: Added the
make_current
keyword argument to theIOLoop
constructor.
Running an IOLoop¶
-
static
IOLoop.
current
(instance=True)[源代码]¶ Returns the current thread’s
IOLoop
.If an
IOLoop
is currently running or has been marked as current bymake_current
, returns that instance. If there is no currentIOLoop
, returnsIOLoop.instance()
(i.e. the main thread’sIOLoop
, creating one if necessary) ifinstance
is true.In general you should use
IOLoop.current
as the default when constructing an asynchronous object, and useIOLoop.instance
when you mean to communicate to the main thread from a different one.在 4.1 版更改: Added
instance
argument to control the fallback toIOLoop.instance()
.
-
IOLoop.
make_current
()[源代码]¶ Makes this the
IOLoop
for the current thread.An
IOLoop
automatically becomes current for its thread when it is started, but it is sometimes useful to callmake_current
explicitly before starting theIOLoop
, so that code run at startup time can find the right instance.
-
static
IOLoop.
instance
()[源代码]¶ Returns a global
IOLoop
instance.Most applications have a single, global
IOLoop
running on the main thread. Use this method to get this instance from another thread. In most other cases, it is better to usecurrent()
to get the current thread’sIOLoop
.
-
IOLoop.
install
()[源代码]¶ Installs this
IOLoop
object as the singleton instance.This is normally not necessary as
instance()
will create anIOLoop
on demand, but you may want to callinstall
to use a custom subclass ofIOLoop
.
-
IOLoop.
start
()[源代码]¶ Starts the I/O loop.
The loop will run until one of the callbacks calls
stop()
, which will make the loop stop after the current event iteration completes.
-
IOLoop.
stop
()[源代码]¶ Stop the I/O loop.
If the event loop is not currently running, the next call to
start()
will return immediately.To use asynchronous methods from otherwise-synchronous code (such as unit tests), you can start and stop the event loop like this:
ioloop = IOLoop() async_method(ioloop=ioloop, callback=ioloop.stop) ioloop.start()
ioloop.start()
will return afterasync_method
has run its callback, whether that callback was invoked before or afterioloop.start
.Note that even after
stop
has been called, theIOLoop
is not completely stopped untilIOLoop.start
has also returned. Some work that was scheduled before the call tostop
may still be run before theIOLoop
shuts down.
-
IOLoop.
run_sync
(func, timeout=None)[源代码]¶ Starts the
IOLoop
, runs the given function, and stops the loop.The function must return either a yieldable object or
None
. If the function returns a yieldable object, theIOLoop
will run until the yieldable is resolved (andrun_sync()
will return the yieldable’s result). If it raises an exception, theIOLoop
will stop and the exception will be re-raised to the caller.The keyword-only argument
timeout
may be used to set a maximum duration for the function. If the timeout expires, aTimeoutError
is raised.This method is useful in conjunction with
tornado.gen.coroutine
to allow asynchronous calls in amain()
function:@gen.coroutine def main(): # do stuff... if __name__ == '__main__': IOLoop.current().run_sync(main)
在 4.3 版更改: Returning a non-
None
, non-yieldable value is now an error.
-
IOLoop.
close
(all_fds=False)[源代码]¶ Closes the
IOLoop
, freeing any resources used.If
all_fds
is true, all file descriptors registered on the IOLoop will be closed (not just the ones created by theIOLoop
itself).Many applications will only use a single
IOLoop
that runs for the entire lifetime of the process. In that case closing theIOLoop
is not necessary since everything will be cleaned up when the process exits.IOLoop.close
is provided mainly for scenarios such as unit tests, which create and destroy a large number ofIOLoops
.An
IOLoop
must be completely stopped before it can be closed. This means thatIOLoop.stop()
must be called andIOLoop.start()
must be allowed to return before attempting to callIOLoop.close()
. Therefore the call toclose
will usually appear just after the call tostart
rather than near the call tostop
.在 3.1 版更改: If the
IOLoop
implementation supports non-integer objects for “file descriptors”, those objects will have theirclose
method whenall_fds
is true.
I/O events¶
-
IOLoop.
add_handler
(fd, handler, events)[源代码]¶ Registers the given handler to receive the given events for
fd
.The
fd
argument may either be an integer file descriptor or a file-like object with afileno()
method (and optionally aclose()
method, which may be called when theIOLoop
is shut down).The
events
argument is a bitwise or of the constantsIOLoop.READ
,IOLoop.WRITE
, andIOLoop.ERROR
.When an event occurs,
handler(fd, events)
will be run.在 4.0 版更改: Added the ability to pass file-like objects in addition to raw file descriptors.
Callbacks and timeouts¶
-
IOLoop.
add_callback
(callback, *args, **kwargs)[源代码]¶ Calls the given callback on the next I/O loop iteration.
It is safe to call this method from any thread at any time, except from a signal handler. Note that this is the only method in
IOLoop
that makes this thread-safety guarantee; all other interaction with theIOLoop
must be done from thatIOLoop
‘s thread.add_callback()
may be used to transfer control from other threads to theIOLoop
‘s thread.To add a callback from a signal handler, see
add_callback_from_signal
.
-
IOLoop.
add_callback_from_signal
(callback, *args, **kwargs)[源代码]¶ Calls the given callback on the next I/O loop iteration.
Safe for use from a Python signal handler; should not be used otherwise.
Callbacks added with this method will be run without any
stack_context
, to avoid picking up the context of the function that was interrupted by the signal.
-
IOLoop.
add_future
(future, callback)[源代码]¶ Schedules a callback on the
IOLoop
when the givenFuture
is finished.The callback is invoked with one argument, the
Future
.
-
IOLoop.
add_timeout
(deadline, callback, *args, **kwargs)[源代码]¶ Runs the
callback
at the timedeadline
from the I/O loop.Returns an opaque handle that may be passed to
remove_timeout
to cancel.deadline
may be a number denoting a time (on the same scale asIOLoop.time
, normallytime.time
), or adatetime.timedelta
object for a deadline relative to the current time. Since Tornado 4.0,call_later
is a more convenient alternative for the relative case since it does not require a timedelta object.Note that it is not safe to call
add_timeout
from other threads. Instead, you must useadd_callback
to transfer control to theIOLoop
‘s thread, and then calladd_timeout
from there.Subclasses of IOLoop must implement either
add_timeout
orcall_at
; the default implementations of each will call the other.call_at
is usually easier to implement, but subclasses that wish to maintain compatibility with Tornado versions prior to 4.0 must useadd_timeout
instead.在 4.0 版更改: Now passes through
*args
and**kwargs
to the callback.
-
IOLoop.
call_at
(when, callback, *args, **kwargs)[源代码]¶ Runs the
callback
at the absolute time designated bywhen
.when
must be a number using the same reference point asIOLoop.time
.Returns an opaque handle that may be passed to
remove_timeout
to cancel. Note that unlike theasyncio
method of the same name, the returned object does not have acancel()
method.See
add_timeout
for comments on thread-safety and subclassing.4.0 新版功能.
-
IOLoop.
call_later
(delay, callback, *args, **kwargs)[源代码]¶ Runs the
callback
afterdelay
seconds have passed.Returns an opaque handle that may be passed to
remove_timeout
to cancel. Note that unlike theasyncio
method of the same name, the returned object does not have acancel()
method.See
add_timeout
for comments on thread-safety and subclassing.4.0 新版功能.
-
IOLoop.
remove_timeout
(timeout)[源代码]¶ Cancels a pending timeout.
The argument is a handle as returned by
add_timeout
. It is safe to callremove_timeout
even if the callback has already been run.
-
IOLoop.
spawn_callback
(callback, *args, **kwargs)[源代码]¶ Calls the given callback on the next IOLoop iteration.
Unlike all other callback-related methods on IOLoop,
spawn_callback
does not associate the callback with its caller’sstack_context
, so it is suitable for fire-and-forget callbacks that should not interfere with the caller.4.0 新版功能.
-
IOLoop.
time
()[源代码]¶ Returns the current time according to the
IOLoop
‘s clock.The return value is a floating-point number relative to an unspecified time in the past.
By default, the
IOLoop
‘s time function istime.time
. However, it may be configured to use e.g.time.monotonic
instead. Calls toadd_timeout
that pass a number instead of adatetime.timedelta
should use this function to compute the appropriate time, so they can work no matter what time function is chosen.
-
class
tornado.ioloop.
PeriodicCallback
(callback, callback_time, io_loop=None)[源代码]¶ Schedules the given callback to be called periodically.
The callback is called every
callback_time
milliseconds. Note that the timeout is given in milliseconds, while most other time-related functions in Tornado use seconds.If the callback runs for longer than
callback_time
milliseconds, subsequent invocations will be skipped to get back on schedule.start
must be called after thePeriodicCallback
is created.在 4.1 版更改: The
io_loop
argument is deprecated.-
is_running
()[源代码]¶ Return True if this
PeriodicCallback
has been started.4.1 新版功能.
-
Debugging and error handling¶
-
IOLoop.
handle_callback_exception
(callback)[源代码]¶ This method is called whenever a callback run by the
IOLoop
throws an exception.By default simply logs the exception as an error. Subclasses may override this method to customize reporting of exceptions.
The exception itself is not passed explicitly, but is available in
sys.exc_info
.
-
IOLoop.
set_blocking_signal_threshold
(seconds, action)[源代码]¶ Sends a signal if the
IOLoop
is blocked for more thans
seconds.Pass
seconds=None
to disable. Requires Python 2.6 on a unixy platform.The action parameter is a Python signal handler. Read the documentation for the
signal
module for more information. Ifaction
is None, the process will be killed if it is blocked for too long.
-
IOLoop.
set_blocking_log_threshold
(seconds)[源代码]¶ Logs a stack trace if the
IOLoop
is blocked for more thans
seconds.Equivalent to
set_blocking_signal_threshold(seconds, self.log_stack)
-
IOLoop.
log_stack
(signal, frame)[源代码]¶ Signal handler to log the stack trace of the current thread.
For use with
set_blocking_signal_threshold
.
Methods for subclasses¶
-
IOLoop.
close_fd
(fd)[源代码]¶ Utility method to close an
fd
.If
fd
is a file-like object, we close it directly; otherwise we useos.close
.This method is provided for use by
IOLoop
subclasses (in implementations ofIOLoop.close(all_fds=True)
and should not generally be used by application code.4.0 新版功能.
-
IOLoop.
split_fd
(fd)[源代码]¶ Returns an (fd, obj) pair from an
fd
parameter.We accept both raw file descriptors and file-like objects as input to
add_handler
and related methods. When a file-like object is passed, we must retain the object itself so we can close it correctly when theIOLoop
shuts down, but the poller interfaces favor file descriptors (they will accept file-like objects and callfileno()
for you, but they always return the descriptor itself).This method is provided for use by
IOLoop
subclasses and should not generally be used by application code.4.0 新版功能.