Asyncio и многопточность
У меня веб сервер Tornado. Раньше использовал его кроутины и замечал, что работает только 1 поток. То есть от того, что на сервере 8 ядер проку не было. Хотя, надо признать, что на 1 ядре очень хорошие показатели производительности.
Сейчас делаю на Tornado + AsyncIo. И я так понимаю ведь будет также, будет работать только на одном потоке? Есть ли возможность запустить несколько потоков? Есть конечно возможность запустить 2 инстанса сервера, но это тогда разные порты и проблема синхронизации. Память у меня в Redis. Однако такие вещи как активное соеденение с сокетом и общение с ним я не могу хранить в redis разумеется. И придётся еще выяснять какое соеденение на каком инстансе. Хотелось бы, чтобы память всё-таки одна была, а вот производительная мощь задействовала несколько ядер.
Ответы (1 шт):
Если сокет-сервер на базе Торнадо, то вот смотри тут https://www.tornadoweb.org/en/stable/tcpserver.html
server = TCPServer()
server.bind(8888)
server.start(0) # Forks multiple sub-processes
IOLoop.current().start()
server.start(0) вместо listen запустит несколько воркеров по количеству ядер.
Тут TCPServer заменишь на tornado.web.Application. https://github.com/tornadoweb/tornado/blob/b4e39e52cd27d6b3b324a399dff046f71545c4a5/tornado/web.py#L2115
app = make_app()
server = HTTPServer(app)
server.bind(8888)
server.start(0)
tornado.ioloop.IOLoop.current().start()
А asyncio в торнадо реализованно заменой loop. Ничего дополнительно не нужно.