非阻塞芹菜任务链

时间:2018-10-19 06:21:22

标签: python parallel-processing celery multitasking feedparser

我的数据库中有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)

0 个答案:

没有答案