Сервер uWSGI блокируется, когда подпроцесс порожден многопроцессорной обработкой. Процесс, но не подпроцессом. Открыть - PullRequest
0 голосов
/ 07 июля 2019

Мое приложение uWSGI должно порождать долго выполняющуюся задачу Python, поэтому я использую multiprocessing. Однако, когда я запускаю этот дочерний процесс, сервер не закрывает сокет, пока дочерний процесс не завершится.

Чтобы помочь в отладке, я также порождал дочерний процесс, используя Popen, а сервер не ожидает завершения процесса popen.

Я включил close-on-exec согласно этому ответу , и шаг multiprocessing.Process по-прежнему блокирует сервер.

Пример кода сервера:

import multiprocessing, subprocess
def _helper(url):
    import time
    time.sleep(10)

def download(url):
    # server closes socket if this is still running, as expected
    p = subprocess.Popen(["/bin/sleep", "1000"])

    # server does not close socket until this finishes
    multiprocessing.Process(target=_helper, args=(url,)).start()

def application(env, start_response):
    download("sample_url")
    print("download() returned!")
    start_response("200 OK", [("Content-Type", "text/html")])
    return [b"ok"]

Я запускаю сервер с uwsgi --socket 127.0.0.1:9090 --wsgi-file server.py --close-on-exec и использую uWSGI 2.0.18 с Python 3.6.8.

...