如何让Flask在Heroku的后台运行线程任务?

时间:2020-06-17 21:27:51

标签: python flask heroku flask-sqlalchemy

因此,基本上,我有一个无限的while循环,它每隔几分钟就会不断抓取一个网站。但是,为了启动此过程,我只是导航到/ scraper以启动新线程,尽管这完全正常,但如果Heroku重新启动其服务器,我并不想一直路由到/ scraper来启动线程。保养。有没有一种方法可以实现此目的,以便如果我路由到主页/我只能运行一个线程,因为我宁愿通过路由到主页而不是/ scraper来启动刮板。

struct HttpHeader {
    String name;
    String value;
};

t_httpUpdate_return updateheader(WiFiClient& client, const String& url,
        const String& currentVersion = "",
        const HttpHeader* headers, int headers_size)
{
    HTTPClient http;
    http.begin(client,url);

    for (int i = 0; i < headers_size; i++) {
        http.addHeader(F(headers[i].name), headers[i].value);
    }

    return handleUpdate(http, currentVersion, false);
}

// Calling it somewhere:
HttpHeader headers[] = { { String("Accept"), String("application/json") } };
updateheader(client, version, headers, 1);

1 个答案:

答案 0 :(得分:0)

您正在寻找的可能是在Heroku中启动两个不同的过程。

Heroku有一个Procfile,它决定什么才真正启动您的应用程序。一种可能是按原样启动您的Web服务器。 Source

可以定义第二个过程,就像在procfile中添加新行一样简单。您可以使用该新行来启动Celery之类的功能,它可以完全满足您的需求。 Celery是一个分布式任务队列系统,您可以使用它来(例如)每n次安排任务。这也可以 消除您的while循环的需要,因为您只需每300秒安排一次即可。

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

显然还有Celery的其他替代方法,找到适合您需求的不错的任务队列框架。您甚至可以直接运行Webscraper,但是,这可能无法像Celery在崩溃时那样恢复自身。