Я использую торнадо с потоками.Сервер tornado несовместим с модулем с резьбой
Короче говоря, каждый раз, когда обработчик websocket получает запросы, он начинает выполнять задачу, которая может занять несколько минут.
Однако, как только клиент подключен, ни один другой клиент не может быть подключен, пока первый не отключится.
Любые идеи?
Я приложил минимальный пример, который использует time.sleep
для имитации длительных задач.
import tornado.web
import tornado.websocket
import tornado.httpserver
import tornado.ioloop
import time
import json
import threading
class TaskHandler(tornado.websocket.WebSocketHandler):
def open(self):
pass
def check_origin(self, origin):
return True
def on_message(self, message):
try:
print 'received: ', message
self.write_message(json.dumps({'status': 'running'}))
def worker_A(kwargs):
time.sleep(100)
pass
def worker_B(kwargs):
time.sleep(100)
pass
threads = []
for target in [worker_A, worker_B]:
t = threading.Thread(target = target, args = ({'xxx': 'yyy'},))
t.daemon = True
t.start()
threads.append(t)
for t in threads:
t.join()
except Exception, e:
print 'TaskHandler: exception: ', e
pass
self.write_message(json.dumps({'status': 'done'}))
def on_close(self):
pass
class Server(tornado.web.Application):
def __init__(self):
handlers = [
('/task', TaskHandler),
]
tornado.web.Application.__init__(self, handlers)
if __name__ == '__main__':
server = tornado.httpserver.HTTPServer(Server())
server.listen(8765, address = '127.0.0.1')
tornado.ioloop.IOLoop.instance().start()
https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor я думаю, это то, что вы хотеть. –