Flask에서 반복되는 백그라운드 작업

5778 단어 pythonflaskrssblogs
대부분의 RSS 리더 앱이 내 취향에 비해 기능이 너무 무거워서 약간의 좌절감을 느끼면서 최근에 URL을 나열하는 feeds.yaml 파일에서 가져오는 very simple RSS feed reader을 빌드하려고 시도했지만 해당 링크를 집계하고 가능한 경우 기사 본문을 제공하는 것 외에 다른 작업은 거의 수행하지 않았습니다. .

앱에서 이와 같은 함수는 Flask가 parser.py의 페이지에서 템플릿을 렌더링할 때 채워지는 데이터 본문을 빌드합니다.


import feedparser
import os
import yaml

def buildConfig():
    with open(os.environ['FEED_YAML_PATH']) as f:
        dict = yaml.load(f, Loader=yaml.FullLoader)
    return dict['feeds']

def buildFeed(feeds):
    feed_body = []
    for url in feeds:
        feed_data = feedparser.parse(url)
        new_feed = {"feed" : url, "data": [feed_data]}
        feed_body.append(new_feed)
    return feed_body


기본적으로 Flask가 템플릿에서 렌더링할 수 있도록 모든 피드 데이터를 더 큰 JSON 개체에 덤프합니다.

저는 Flask를 다시 시작하지 않고 이 파일에 추가한 새 피드를 볼 수 있기를 원했습니다. 이를 수행하는 한 가지 방법은 모든 페이지 로드에서 이 데이터 개체를 재생성하는 것이었지만, 많은 것을 추가하지 않으면 로드하는 데 시간이 오래 걸릴 것입니다. 추가 논리 또는 기타 종속성 또는 구성 요소(메모리에 피드 저장 등)

앱에 새 구성 요소를 추가하지 않기 위해(매우 작은 Docker 이미지이며 앱 데이터 복원은 이 Yaml 파일만 사용할 수 있음) apscheduler 함수가 있는 BackgroundScheduler 패키지를 사용하여 반복 백그라운드 작업을 추가하기로 결정했습니다. app.py:

from apscheduler.schedulers.background import BackgroundScheduler


그런 다음 앱 시작 시 우리가 잠시 후에 정의할 반복 작업에 의해 업데이트될 feed_data 개체를 저장할 변수를 정의하고 초기화합니다.

feed_data = None

@app.before_first_request
def initialize_feeds():
    feeds = buildConfig()
    global feed_data
    feed_data = buildFeed(feeds)
    return feed_data



그런 다음 위 함수와 유사하게 작동하는 updateFeeds 함수를 추가합니다(프로덕션 앱에서는 반복하지 않고 위의 함수가 이 함수를 참조하도록 할 수 있지만 데모용).

def update_feeds():
    feeds = buildConfig()
    global feed_data
    feed_data = buildFeed(feeds)
    return feed_data

scheduler = BackgroundScheduler()
job = scheduler.add_job(update_feeds, 'interval', minutes=1)
scheduler.start()


그런 다음 해당 함수를 1분 간격으로 위의 scheduler.add_job() 함수에 대한 인수로 실행합니다.

이제 새 URL이 포함된 Yaml 파일을 변경하면 feed_data 개체가 백그라운드에서 업데이트되고 로드 시간은 영향을 받지 않습니다.

좋은 웹페이지 즐겨찾기