import datetime
import errno
+import functools
import heapq
import os
import logging
except ImportError:
signal = None
+try:
+ from concurrent import futures
+except ImportError:
+ futures = None
+
from tornado.platform.auto import set_close_exec, Waker
# avoid it when we can.
self._waker.wake()
+ def add_future(self, future, callback):
+ """Schedules a callback on the IOLoop when the given future is finished.
+
+ Requires the concurrent.futures module (standard in python 3.2+,
+ available via "pip install futures" in older versions).
+ """
+ assert isinstance(future, futures.Future)
+ future.add_done_callback(
+ lambda future: self.add_callback(
+ functools.partial(callback, future)))
+
def _run_callback(self, callback):
try:
callback()
from tornado.testing import AsyncTestCase, LogTrapTestCase, get_unused_port
from tornado.test.util import unittest
+try:
+ from concurrent import futures
+except ImportError:
+ futures = None
+
class TestIOLoop(AsyncTestCase, LogTrapTestCase):
def test_add_callback_wakeup(self):
sock.close()
+class TestIOLoopFutures(AsyncTestCase, LogTrapTestCase):
+ def test_add_future_threads(self):
+ with futures.ThreadPoolExecutor(1) as pool:
+ self.io_loop.add_future(pool.submit(lambda: None),
+ lambda future: self.stop(future))
+ future = self.wait()
+ self.assertTrue(future.done())
+ self.assertTrue(future.result() is None)
+TestIOLoopFutures = unittest.skipIf(
+ futures is None, "futures module is not present")(TestIOLoopFutures)
+
+
if __name__ == "__main__":
unittest.main()