LINUX.ORG.RU

На чём написать примитивный HTTP-сервер (не веб) на Python 3?

 ,


1

5

Пишу в Development, потому что это всё-таки не веб ни разу.

У меня есть пачка скриптов на питоне, каждый из которых вызывает цепочку внешних утилит и генерирует бинарный выходной файл. Время работы скрипта ~2-3 минуты, большую часть которого (99%) он проводит в ожидании завершения дочерних процессов.

Я хочу сделать из этих скриптов HTTP-сервер, т. е. вместо

python3 ./script1.py --foo=bar > output

писать

curl -fsSL http://localhost:8000/script1 -G -d foo=bar -o output

Я набросал прототип на http.server, но мне не нравится, что приходится заниматься разбором URL и ещё много чего делать вручную. Плюс я бы хотел уметь обрабатывать несколько запросов одновременно. Да, я знаю про GIL, но поскольку большая часть работы происходит во внешних процессах, как минимум в теории GIL не должен мешать.

Так вот, как это сделать?

  • Посоветуйте минимальный HTTP-фреймворк, который бы занимался принятием запросов, разбором URL и обработкой эксепшенов, без какой-либо связи с вебом?
  • Часть про «несколько запросов одновременно» делать через асинхронщину или через потоки? Существуют ли асинхронные эквиваленты subprocess.run / subprocess.Popen?
★★★★★

Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от vvn_black

Выглядит как то что надо, спасибо.

intelfx ★★★★★
() автор топика

bottle.py хватит всем

zolden ★★★★★
()

На Python 3

anonymous
()

Создаешь ручку /create_job, которая куда-то у тебя пишет задачу с уникальным ID. Этот ID отдаешь клиенту. Клиент ходит в /status_job с этим ID, проверяя статус задачи. Когда статус меняется в success(или что-то еще), то результаты забираешь, например, в /result_job. Это более сложное решение, чем просто дернуть скрипт при обращении к нему, но зато более предсказуемое, т.к. требует только локи.

xpahos ★★★★★
()

werkzeug покатит. bottle тебе уже посоветовали, ну или cherrypy глянь.

alex_the_v ★★★
()

Pyramid простой и мощный

anonymous
()

Существуют ли асинхронные эквиваленты subprocess.run / subprocess.Popen?

Просто в тред заворачиваем.

def start_thread(func, *a, **k):
    """ run function in a new thread
    """

    th = threading.Thread(target=func, args=a, kwargs=k, daemon=True)
    try:
        th.start()
    except RuntimeError:
        log('RuntimeError: cannot start {}'.format(th_name))
        return 1

start_thread(subprocess.run, cmd) # рожаем и едем дальше. Тред стартует за миллисекунду.

anonymous
()
Ответ на: комментарий от tz4678

httpie

Абсолютный оффтопик для этой задачи, но прикольная тулза, спасибо.

flask

Три раза написал же: не веб. Не веб. Нафига мне там фреймворк со встроенным шаблонизатором?

intelfx ★★★★★
() автор топика

aiohttp - мы вот сами недавно заюзали

lovesan ★★
()
Ответ на: комментарий от intelfx

Вас в детстве унижали вебари?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.