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.
A level-triggered I/O loop.
We use epoll (Linux) or kqueue (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 either epoll or kqueue.
Example usage for a simple TCP server:
import errno import functools import ioloop import socket def connection_ready(sock, fd, events): while True: try: connection, address = sock.accept() except socket.error, e: if e.args not in (errno.EWOULDBLOCK, errno.EAGAIN): raise return connection.setblocking(0) handle_connection(connection, address) 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 = ioloop.IOLoop.instance() callback = functools.partial(connection_ready, sock) io_loop.add_handler(sock.fileno(), callback, io_loop.READ) io_loop.start()
Returns the current thread’s IOLoop.
A common pattern for classes that depend on IOLoops is to use a default argument to enable programs with multiple IOLoops but not require the argument for simpler applications:
class MyClass(object): def __init__(self, io_loop=None): self.io_loop = io_loop or IOLoop.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 call make_current explictly before starting the IOLoop, so that code run at startup time can find the right instance.
Returns a global IOLoop instance.
Returns true if the singleton instance has been created.
Installs this IOLoop object as the singleton instance.
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.
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 after async_method has run its callback, whether that callback was invoked before or after ioloop.start.
Note that even after stop has been called, the IOLoop is not completely stopped until IOLoop.start has also returned. Some work that was scheduled before the call to stop may still be run before the IOLoop shuts down.
Starts the IOLoop, runs the given function, and stops the loop.
The keyword-only argument timeout may be used to set a maximum duration for the function. If the timeout expires, a TimeoutError is raised.
This method is useful in conjunction with tornado.gen.coroutine to allow asynchronous calls in a main() function:
@gen.coroutine def main(): # do stuff... if __name__ == '__main__': IOLoop.instance().run_sync(main)
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 the IOLoop itself).
Many applications will only use a single IOLoop that runs for the entire lifetime of the process. In that case closing the IOLoop 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 of IOLoops.
An IOLoop must be completely stopped before it can be closed. This means that IOLoop.stop() must be called and IOLoop.start() must be allowed to return before attempting to call IOLoop.close(). Therefore the call to close will usually appear just after the call to start rather than near the call to stop.
Changed in version 3.1: If the IOLoop implementation supports non-integer objects for “file descriptors”, those objects will have their close method when all_fds is true.
Registers the given handler to receive the given events for fd.
The events argument is a bitwise or of the constants IOLoop.READ, IOLoop.WRITE, and IOLoop.ERROR.
When an event occurs, handler(fd, events) will be run.
Changes the events we listen for fd.
Stop listening for events on fd.
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 the IOLoop must be done from that IOLoop‘s thread. add_callback() may be used to transfer control from other threads to the IOLoop‘s thread.
To add a callback from a signal handler, see add_callback_from_signal.
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.
Schedules a callback on the IOLoop when the given Future is finished.
The callback is invoked with one argument, the Future.
Runs the callback at the time deadline from the I/O loop.
Returns an opaque handle that may be passed to remove_timeout to cancel.
Cancels a pending timeout.
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 is time.time. However, it may be configured to use e.g. time.monotonic instead. Calls to add_timeout that pass a number instead of a datetime.timedelta should use this function to compute the appropriate time, so they can work no matter what time function is chosen.
Schedules the given callback to be called periodically.
The callback is called every callback_time milliseconds.
Starts the timer.
Stops the timer.
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.
Sends a signal if the IOLoop is blocked for more than s 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. If action is None, the process will be killed if it is blocked for too long.
Logs a stack trace if the IOLoop is blocked for more than s seconds.
Equivalent to set_blocking_signal_threshold(seconds, self.log_stack)