Asyncio и многопточность

У меня веб сервер Tornado. Раньше использовал его кроутины и замечал, что работает только 1 поток. То есть от того, что на сервере 8 ядер проку не было. Хотя, надо признать, что на 1 ядре очень хорошие показатели производительности.

Сейчас делаю на Tornado + AsyncIo. И я так понимаю ведь будет также, будет работать только на одном потоке? Есть ли возможность запустить несколько потоков? Есть конечно возможность запустить 2 инстанса сервера, но это тогда разные порты и проблема синхронизации. Память у меня в Redis. Однако такие вещи как активное соеденение с сокетом и общение с ним я не могу хранить в redis разумеется. И придётся еще выяснять какое соеденение на каком инстансе. Хотелось бы, чтобы память всё-таки одна была, а вот производительная мощь задействовала несколько ядер.


Ответы (1 шт):

Автор решения: eri

Если сокет-сервер на базе Торнадо, то вот смотри тут 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. Ничего дополнительно не нужно.

→ Ссылка