Как правильно заставить Flask запускать многопоточную задачу в фоновом режиме на Heroku? - PullRequest
0 голосов
/ 18 июня 2020

Итак, в основном, у меня есть бесконечное while l oop, которое постоянно очищает веб-сайт каждые несколько минут. Однако, чтобы запустить этот процесс, я просто перехожу к / scraper, чтобы запустить новый поток, и, хотя это работает совершенно нормально, я не хочу, чтобы мне приходилось продолжать маршрутизацию на / scraper для запуска потока, если Heroku перезапустит свои серверы для поддержание. Есть ли способ реализовать это так, чтобы при переходе на домашнюю страницу / у меня мог работать только один поток, так как я бы предпочел запустить скребок, перенаправив его на домашнюю страницу, чем /scraper.

def scrappy():
    while True:
        try:
            print("Loading scraper...")
            exec(open("texas_scraper.py").read()) #time.sleep(300) inside this .py
        except Exception as e:
            print("Error: There may be a bug in the code or your environment setup.")
            print(e)
            time.sleep(60)
        continue

@app.route('/')
def index():
    print("Someone is on homepage")
    return '''
        <html><body>
        Hi. <a href="/uploads"> Please click here to download the roster.</a>
        </body></html>
        '''

@app.route('/scraper')
def digger():
    t1 = Thread(target = scrappy)
    t1.setDaemon(True)
    t1.start()
    print("Someone started the scraper")
    return '''
        <html><body>
        Hi. Loading scraper now!
        </body></html>
        '''

1 Ответ

0 голосов
/ 18 июня 2020

То, что вы ищете, вероятно, запускает два разных процесса в Heroku.

Heroku имеет Procfile, который определяет, что на самом деле запускает ваше приложение. Один из них, вероятно, запускает ваш веб-сервер как есть. Источник .

Можно определить второй процесс, это так же просто, как добавление новой строки в файл proc. Вы можете использовать эту новую строку, чтобы начать что-то вроде Celery , которое может делать именно то, что вам нужно. Celery - это распределенная система очередей задач, которую можно использовать, например, для планирования задачи каждый n раз. Это также устранит необходимость в вашем while l oop, так как вы можете просто запланировать его каждые 300 секунд.

web: flask run
worker: celery worker -A your_app/celery.py

Очевидно, что существуют и другие альтернативы Celery, найдите хорошую структуру очереди задач, которая соответствует вашим потребностям. Вы даже можете запустить свой веб-скреб напрямую, однако он может не восстановиться, как это сделал бы Celery в случае ошибки sh.

...