Моята настройка е python tornado сървър, който асинхронно обработва задачи с ThreadPoolExecutor
. При някои условия задачата може да се превърне в безкраен цикъл. С декоратора with_timeout
успях да хвана изключението за изчакване и да върна резултат за грешка на клиента. Проблемът е, че задачата все още работи във фонов режим. Как е възможно да спрете изпълнението на задачата в ThreadPoolExecutor
? Или е възможно да отмените Future
? Ето кода, който възпроизвежда проблема. Стартирайте кода с библиотеките tornado 4 и concurrent.futures и отидете на http://localhost:8888/test
from tornado.concurrent import run_on_executor
from tornado.gen import with_timeout
from tornado.ioloop import IOLoop
import tornado.web
from tornado import gen
from concurrent.futures import ThreadPoolExecutor
import datetime
MAX_WAIT_SECONDS = 10
class MainHandler(tornado.web.RequestHandler):
executor = ThreadPoolExecutor(2)
@run_on_executor
def test_func(self):
...
#infinite loop might be here
...
@tornado.gen.coroutine
def get(self):
future = self.test_func()
try:
result_search_struct = yield with_timeout(datetime.timedelta(seconds=MAX_WAIT_SECONDS), future )
self.write({'status' : 0})
self.finish()
except Exception, e:
#how to cancel the task here if it was timeout
future.cancel() # <-- Does not work
self.write({'status' : 100})
self.finish()
application = tornado.web.Application([
(r"/test", MainHandler),
])
application.listen(8888)
IOLoop.instance().start()