from binascii import hexlify
+from tornado.concurrent import Future
from tornado import ioloop
from tornado.iostream import PipeIOStream
from tornado.log import gen_log
Subprocess._waiting[self.pid] = self
Subprocess._try_cleanup_process(self.pid)
+ def wait_for_exit(self):
+ """Returns a `.Future` which resolves when the process exits.
+
+ Usage::
+
+ ret = yield proc.wait_for_exit()
+
+ This is a coroutine-friendly alternative to `set_exit_callback`
+ (and a replacement for the blocking `subprocess.Popen.wait`).
+
+ .. versionadded:: 4.2
+ """
+ future = Future()
+ self.set_exit_callback(future.set_result)
+ return future
+
@classmethod
def initialize(cls, io_loop=None):
"""Initializes the ``SIGCHLD`` handler.
from tornado.log import gen_log
from tornado.process import fork_processes, task_id, Subprocess
from tornado.simple_httpclient import SimpleAsyncHTTPClient
-from tornado.testing import bind_unused_port, ExpectLog, AsyncTestCase
+from tornado.testing import bind_unused_port, ExpectLog, AsyncTestCase, gen_test
from tornado.test.util import unittest, skipIfNonUnix
from tornado.web import RequestHandler, Application
self.assertEqual(ret, 0)
self.assertEqual(subproc.returncode, ret)
+ @gen_test
+ def test_sigchild_future(self):
+ skip_if_twisted()
+ Subprocess.initialize()
+ self.addCleanup(Subprocess.uninitialize)
+ subproc = Subprocess([sys.executable, '-c', 'pass'])
+ ret = yield subproc.wait_for_exit()
+ self.assertEqual(ret, 0)
+ self.assertEqual(subproc.returncode, ret)
+
def test_sigchild_signal(self):
skip_if_twisted()
Subprocess.initialize(io_loop=self.io_loop)