Как использовать несколько ядер с веб-сервисом на основе Python Klein
Я пишу веб-сервис на основе фреймворка Кляйна
https://klein.readthedocs.io/en/latest/index.html
На данном этапе я тестирую свой сервис, он может обрабатывать около 70 запросов в секунду на экземпляре amazon t2.medium. Но когда я использую top для проверки сервера, он использует только 100% CPU. Я думаю, что экземпляр amazon t2.medium должен иметь 2 процессора, поэтому мне интересно, есть ли способ изменить код моего веб-сервиса, чтобы использовать все возможные процессоры и, надеюсь, обрабатывать больше запросов.
Я прочитал документацию Python и нашел multiprocessing
модуль, но я не уверен, что это будет правильным решением. Прямо сейчас основная функция моего веб-сервиса
APP = Klein()
if __name__ == "__main__":
APP.run("0.0.0.0", SERVER_PORT)
Существует ли прямое исправление, позволяющее этой службе использовать несколько процессоров для обработки входящих запросов? Спасибо, что прочитали вопрос.
1 ответ
Конечно, можно использовать multiprocessing
и это, конечно же, чертовски легко ускорить процессы.
from multiprocessing import Process
from klein import Klein
def runserver(interface, port, logFile):
app = Klein()
@app.route('/')
def heyEarth(request):
return 'Hey Earth!'
app.run(interface, port, logFile)
process_list = []
for x, port in enumerate([8000, 8001, 8002, 8003]):
logfilename = open('localhost' + str(port) + '.log', 'a')
process_list.append(Process(target=runserver, args=('localhost', port, logfilename)))
process_list[x].daemon = True
process_list[x].start()
process_list.pop().join()
В корпоративной среде лучше и надежнее работать за выделенным балансировщиком нагрузки, таким как nginx. Таким образом, приведенный выше фрагмент должен использоваться только для запуска веб-серверов, тогда вся ваша балансировка нагрузки должна обрабатываться выделенным балансировщиком нагрузки.
Держите многопроцессорный код на минимальном уровне, иначе базовые вещи, такие как отладка и общие системные файлы, станут раздражать. И это "нормальный" материал, есть МНОЖЕСТВО НЕНОРМАЛЬНОСТИ, которые могут возникнуть, и никто не сможет помочь вам, потому что вы сами не знаете, что происходит. Просто запустив этот фрагмент, я заметил несколько странных вещей с сигналами и Twisted. Я думаю, что это может быть исправлено, если я запустил все klein
импорт в runserver()
,
Получайте информацию, учитесь на чужих ошибках, прислушайтесь к предупреждениям тех, кто был сожжен multiprocessing
и иди сделай приложение! Надеюсь, это поможет:D
Рекомендации
- Tornado: Запуск и развертывание - это документ Tornado, но он все равно должен помочь
- Multicore TwistedWeb - это "Twisted" подход к многопроцессорности со стороны разработчика ядра. Стоит прочитать всем, кто хочет запускать процессы Twisted и spawn.