Flask에서 반복되는 백그라운드 작업
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 개체가 백그라운드에서 업데이트되고 로드 시간은 영향을 받지 않습니다.
Reference
이 문제에 관하여(Flask에서 반복되는 백그라운드 작업), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jmarhee/recurring-background-jobs-in-flask-3407텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)