У меня есть эта асинхронная рабочая функциональность, использующая ioloop торнадо. Я пытаюсь изящно завершить цикл нажатием Ctrl+C, но получаю следующую ошибку
tornado.ioloop.TimeoutError: время ожидания операции истекло через None секунд
Я знаю, что могу поймать его, но я хочу закончить процесс изящно, как я могу этого добиться?
#!/usr/bin/env python
import time
import signal
import random
from tornado import gen, ioloop, queues
concurrency = 10
def sig_exit(signum, frame):
ioloop.IOLoop.current().add_callback_from_signal(shutdown)
def shutdown():
print('Will shutdown in few seconds ...')
io_loop = ioloop.IOLoop.current()
deadline = time.time() + 3
def stop_loop():
now = time.time()
if now < deadline and (io_loop._callbacks or io_loop._timeouts):
io_loop.add_timeout(now + 1, stop_loop)
else:
io_loop.stop()
print('Shutdown')
stop_loop()
@gen.coroutine
def main():
q = queues.Queue()
q.put(1)
@gen.coroutine
def do_stuff():
print("doing stuff")
yield gen.Task(ioloop.IOLoop.instance().add_timeout, time.time() + random.randint(1, 5))
print("done doing stuff")
@gen.coroutine
def worker():
while True:
yield do_stuff()
for _ in range(concurrency):
worker()
yield q.join()
if __name__ == '__main__':
signal.signal(signal.SIGTERM, sig_exit)
signal.signal(signal.SIGINT, sig_exit)
io_loop = ioloop.IOLoop.instance()
io_loop.run_sync(main)
http server
, встроенного вioloop
, не нашла кого-то, кто сделал это сrun_async
, как в моем случае... - person shahaf   schedule 18.04.2018