tornado.ioloop — Main event loop¶
An I/O event loop for non-blocking sockets.
Typical applications will use a single IOLoop
object, in theIOLoop.instance
singleton. The IOLoop.start
method should usuallybe called at the end of the main()
function. Atypical applications mayuse 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 useepoll
(Linux) orkqueue
(BSD and Mac OS X) if theyare available, or else we fall back on select(). If you areimplementing a system that needs to handle thousands ofsimultaneous connections, you should use a system that supportseitherepoll
orkqueue
.
Example usage for a simple TCP server:- import errno
import functools
import tornado.ioloop
import socket
def connectionready(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)
handleconnection(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-constructedIOLoop
becomes the thread’s currentIOLoop
, unless there already is a currentIOLoop
. This behaviorcan be controlled with themake_current
argument to theIOLoop
constructor: ifmake_current=True
, the newIOLoop
will alwaystry to become current and it raises an error if there is already acurrent instance. Ifmake_current=False
, the newIOLoop
willnot try to become current.
在 4.2 版更改: Added themake_current
keyword argument to theIOLoop
constructor.- import errno
Running an IOLoop¶
- static
IOLoop.
current
(instance=True)[源代码]¶
Returns the current thread’sIOLoop
.
If anIOLoop
is currently running or has been marked ascurrent bymake_current
, returns that instance. If there isno currentIOLoop
, returnsIOLoop.instance()
(i.e. themain thread’sIOLoop
, creating one if necessary) ifinstance
is true.
In general you should useIOLoop.current
as the default whenconstructing an asynchronous object, and useIOLoop.instance
when you mean to communicate to the main thread from a differentone.
在 4.1 版更改: Addedinstance
argument to control the fallback toIOLoop.instance()
.
IOLoop.
makecurrent
()[源代码]¶
Makes this theIOLoop
for the current thread.
AnIOLoop
automatically becomes current for its threadwhen 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 rightinstance.
在 4.1 版更改: AnIOLoop
created while there is no currentIOLoop
will automatically become current.
- _static
IOLoop.
instance
()[源代码]¶
Returns a globalIOLoop
instance.
Most applications have a single, globalIOLoop
running on themain thread. Use this method to get this instance fromanother thread. In most other cases, it is better to usecurrent()
to get the current thread’sIOLoop
.
IOLoop.
install
()[源代码]¶
Installs thisIOLoop
object as the singleton instance.
This is normally not necessary asinstance()
will createanIOLoop
on demand, but you may want to callinstall
to usea custom subclass ofIOLoop
.
When using anIOLoop
subclass,install
must be called priorto creating any objects that implicitly create their ownIOLoop
(e.g.,tornado.httpclient.AsyncHTTPClient
).
IOLoop.
start
()[源代码]¶
Starts the I/O loop.
The loop will run until one of the callbacks callsstop()
, whichwill 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 tostart()
will return immediately.
To use asynchronous methods from otherwise-synchronous code (such asunit 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 runits callback, whether that callback was invoked before orafterioloop.start
.
Note that even afterstop
has been called, theIOLoop
is notcompletely stopped untilIOLoop.start
has also returned.Some work that was scheduled before the call tostop
may stillbe run before theIOLoop
shuts down.- ioloop = IOLoop()
IOLoop.
run_sync
(_func, timeout=None)[源代码]¶
Starts theIOLoop
, runs the given function, and stops the loop.
The function must return either a yieldable object orNone
. 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 raisesan exception, theIOLoop
will stop and the exception will bere-raised to the caller.
The keyword-only argumenttimeout
may be used to seta maximum duration for the function. If the timeout expires,aTimeoutError
is raised.
This method is useful in conjunction withtornado.gen.coroutine
to allow asynchronous calls in amain()
function:- @gen.coroutine
def main():
# do stuff…
if name == 'main':
IOLoop.current().runsync(main)
在 4.3 版更改: Returning a non-None
, non-yieldable value is now an error.- @gen.coroutine
IOLoop.
close
(_all_fds=False)[源代码]¶
Closes theIOLoop
, freeing any resources used.
Ifallfds
is true, all file descriptors registered on theIOLoop will be closed (not just the ones created by theIOLoop
itself).
Many applications will only use a singleIOLoop
that runs for theentire lifetime of the process. In that case closing theIOLoop
is not necessary since everything will be cleaned up when theprocess exits.IOLoop.close
is provided mainly for scenariossuch as unit tests, which create and destroy a large number ofIOLoops
.
AnIOLoop
must be completely stopped before it can be closed. Thismeans thatIOLoop.stop()
must be called _andIOLoop.start()
mustbe allowed to return before attempting to callIOLoop.close()
.Therefore the call toclose
will usually appear just afterthe call tostart
rather than near the call tostop
.
在 3.1 版更改: If theIOLoop
implementation supports non-integer objectsfor “file descriptors”, those objects will have theirclose
method whenall_fds
is true.
I/O events¶
IOLoop.
addhandler
(_fd, handler, events)[源代码]¶
Registers the given handler to receive the given events forfd
.
Thefd
argument may either be an integer file descriptor ora file-like object with afileno()
method (and optionally aclose()
method, which may be called when theIOLoop
is shutdown).
Theevents
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 toraw file descriptors.
IOLoop.
updatehandler
(_fd, events)[源代码]¶
Changes the events we listen forfd
.
在 4.0 版更改: Added the ability to pass file-like objects in addition toraw file descriptors.
IOLoop.
removehandler
(_fd)[源代码]¶
Stop listening for events onfd
.
在 4.0 版更改: Added the ability to pass file-like objects in addition toraw file descriptors.
Callbacks and timeouts¶
IOLoop.
addcallback
(_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 onlymethod inIOLoop
that makes this thread-safety guarantee; allother interaction with theIOLoop
must be done from thatIOLoop
‘s thread.add_callback()
may be used to transfercontrol from other threads to theIOLoop
‘s thread.
To add a callback from a signal handler, seeadd_callback_from_signal
.
IOLoop.
addcallback_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 usedotherwise.
Callbacks added with this method will be run without anystack_context
, to avoid picking up the context of the functionthat was interrupted by the signal.
IOLoop.
addfuture
(_future, callback)[源代码]¶
Schedules a callback on theIOLoop
when the givenFuture
is finished.
The callback is invoked with one argument, theFuture
.
IOLoop.
addtimeout
(_deadline, callback, *args, **kwargs)[源代码]¶
Runs thecallback
at the timedeadline
from the I/O loop.
Returns an opaque handle that may be passed toremove_timeout
to cancel.deadline
may be a number denoting a time (on the samescale asIOLoop.time
, normallytime.time
), or adatetime.timedelta
object for a deadline relative to thecurrent time. Since Tornado 4.0,call_later
is a moreconvenient alternative for the relative case since it does notrequire a timedelta object.
Note that it is not safe to calladd_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 eitheradd_timeout
orcall_at
; the default implementations of each will callthe other.call_at
is usually easier to implement, butsubclasses that wish to maintain compatibility with Tornadoversions prior to 4.0 must useadd_timeout
instead.
在 4.0 版更改: Now passes throughargs
and**kwargs
to the callback.
IOLoop.
callat
(_when, callback, _args, kwargs)[源代码]¶
Runs thecallback
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 toremove_timeout
to cancel. Note that unlike theasyncio
method of the samename, the returned object does not have acancel()
method.
Seeadd_timeout
for comments on thread-safety and subclassing.
4.0 新版功能.
IOLoop.
call_later
(_delay, callback, *args, _kwargs)[源代码]¶
Runs thecallback
afterdelay
seconds have passed.
Returns an opaque handle that may be passed toremove_timeout
to cancel. Note that unlike theasyncio
method of the samename, the returned object does not have acancel()
method.
Seeadd_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 byadd_timeout
. It issafe to callremove_timeout
even if the callback has alreadybeen run.
IOLoop.
spawncallback
(_callback, *args, **kwargs)[源代码]¶
Calls the given callback on the next IOLoop iteration.
Unlike all other callback-related methods on IOLoop,spawncallback
does not associate the callback with its caller’sstack_context
, so it is suitable for fire-and-forget callbacksthat should not interfere with the caller.
4.0 新版功能.
IOLoop.
time
()[源代码]¶
Returns the current time according to theIOLoop
‘s clock.
The return value is a floating-point number relative to anunspecified time in the past.
By default, theIOLoop
‘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 theappropriate time, so they can work no matter what time functionis chosen.
- _class
tornado.ioloop.
PeriodicCallback
(callback, callback_time, io_loop=None)[源代码]¶
Schedules the given callback to be called periodically.
The callback is called everycallback_time
milliseconds.Note that the timeout is given in milliseconds, while most othertime-related functions in Tornado use seconds.
If the callback runs for longer thancallback_time
milliseconds,subsequent invocations will be skipped to get back on schedule.start
must be called after thePeriodicCallback
is created.
在 4.1 版更改: Theio_loop
argument is deprecated.is_running
()[源代码]¶
Return True if thisPeriodicCallback
has been started.
4.1 新版功能.
Debugging and error handling¶
IOLoop.
handlecallback_exception
(_callback)[源代码]¶
This method is called whenever a callback run by theIOLoop
throws an exception.
By default simply logs the exception as an error. Subclassesmay override this method to customize reporting of exceptions.
The exception itself is not passed explicitly, but is availableinsys.exc_info
.
IOLoop.
setblocking_signal_threshold
(_seconds, action)[源代码]¶
Sends a signal if theIOLoop
is blocked for more thans
seconds.
Passseconds=None
to disable. Requires Python 2.6 on a unixyplatform.
The action parameter is a Python signal handler. Read thedocumentation for thesignal
module for more information.Ifaction
is None, the process will be killed if it isblocked for too long.
IOLoop.
setblocking_log_threshold
(_seconds)[源代码]¶
Logs a stack trace if theIOLoop
is blocked for more thans
seconds.
Equivalent tosetblocking_signal_threshold(seconds,
self.log_stack)
IOLoop.
log_stack
(_signal, frame)[源代码]¶
Signal handler to log the stack trace of the current thread.
For use withset_blocking_signal_threshold
.
Methods for subclasses¶
IOLoop.
closefd
(_fd)[源代码]¶
Utility method to close anfd
.
Iffd
is a file-like object, we close it directly; otherwisewe useos.close
.
This method is provided for use byIOLoop
subclasses (inimplementations ofIOLoop.close(allfds=True)
and shouldnot generally be used by application code.
4.0 新版功能.
IOLoop.
split_fd
(_fd)[源代码]¶
Returns an (fd, obj) pair from anfd
parameter.
We accept both raw file descriptors and file-like objects asinput toadd_handler
and related methods. When a file-likeobject is passed, we must retain the object itself so we canclose it correctly when theIOLoop
shuts down, but thepoller interfaces favor file descriptors (they will acceptfile-like objects and callfileno()
for you, but theyalways return the descriptor itself).
This method is provided for use byIOLoop
subclasses and shouldnot generally be used by application code.
4.0 新版功能.
原文:
https://tornado-zh-cn.readthedocs.io/zh_CN/latest/ioloop.html