Процесс дочернего питона застревает - PullRequest
0 голосов
/ 07 октября 2019

Прежде чем мы начнем, я делаю все в контейнере Python (AWS Fargate), поэтому есть некоторые ограничения.

Я использую модуль Flask для запуска веб-сервера и запуска постоянного дочернего процесса с модулем многопроцессорной обработки. запускать повторяющиеся фоновые задачи. Все работает нормально, но ночью дочерний процесс зависает случайно, без логов или следов. Я даже запустил пользовательскую проверку работоспособности, чтобы убедиться, что она жива и работает, но она перестает работать, загрузка ЦП падает, и я не могу понять, что происходит. Он выполняет много сетевых вызовов, но я ожидал, что он завершится по таймауту, а не зависнет. Загрузка ЦП не работает на ~ 40%, пока он работает, а объем оперативной памяти постоянен на уровне 18%. Потенциально в нем могут заканчиваться файловые дескрипторы, но с чего бы это?

Код выглядит следующим образом:

from flask import Flask
from multiprocessing import Process
import time

def poll():
    while True:
        blablabla
        time.sleep(60)

p = Process(target=poll)
p.start()
p.join

app = Flask(__name__)

@app.route('/', methods=['GET'])
def java():
    return app.send_static_file('java.html')

Я не могу использовать тайм-ауты, потому что дочерний процесс должен работать бесконечнои я не могу порождать новый процесс каждые несколько минут, потому что ядро ​​контейнера довольно скоро исчерпает PID. Я не понимаю, как я могу использовать «попробовать», потому что это не сбой, а просто перестает отвечать.

Технически, я могу запустить другой контейнер для этой подзадачи, но мне интересно, есть ли лучшее решение?

Спасибо

1 Ответ

0 голосов
/ 08 октября 2019

Если blahblahblah не завершится, poll() будет зацикливаться бесконечно, и ваш начальный процесс застрянет при ожидании .join(), которое никогда не произойдет.

https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Process.join

...