我的数据库中有30k + RSS feed网址。我正在使用feedparser来解析和提取每个RSS feed中的新条目。获得新条目的列表后,我需要验证它们并将其保存在DB中。目前,我正在考虑编写3个独立的芹菜任务: 任务1将解析每个URL,并在有新条目的地方填充python类对象。 任务2将接受该对象并对其进行验证。如果该对象有效,则它将返回同一对象,否则将返回ErrorObject并包含原始对象和错误详细信息。 任务3将接受两者之一,并根据对象类型将其保存在数据库中
基本上,当我运行python脚本时,它将从数据库中检索所有URL,然后将每个URL传递给任务1,响应应自动从中转到任务2,然后任务2的响应应移至任务3。 我不想阻止任务2 /任务3,一旦前一项任务处理了一个条目,这些任务就会自动启动。我正在使用以下代码将所有网址传递给任务1,但是不确定如何确保在任务1仍在处理30k + URL时任务2不被阻止
rss_urls = db.session.query(RSSfeed).filter(RSSfeed.rss_url != None).all()
jobs = group(rss_parse.s(item) for item.rss_url in rss_urls)
result = jobs.apply_async()
我将Celery和RabbitMQ用作经纪人
我可以这样吗?
@celery.task
def rss_parse(rss_url):
feed_entry_obj = get_new_entries_from_rss_feed(rss_url)
task2.apply_async(feed_entry_obj)
@celery.task
def task2(feed_entry_obj):
validation_obj = validate(feed_entry_obj)
task3.apply_async(validation_obj)
@celery.task
def task3(validation_obj):
save_in_db(validation_obj)