如何连锁芹菜任务

时间:2015-02-05 06:50:22

标签: python celery

我想以STANDARD的方式连接芹菜任务。

我是一个json文件。在该文件中,有许多harcoded网址。我需要废弃这些链接,并删除在抓取这些链接时找到的链接。

目前,我这样做。

for each_news_source, news_categories in rss_obj.iteritems():
    for each_category in news_categories:
        category = each_category['category']
        rss_link = each_category['feed']
        json_id = each_category['json']
        try:
            list_of_links = getrsslinks(rss_link)
            for link in list_of_links:
                scrape_link.delay(link, json_id, category)
        except Exception,e:
            print "Invalid url", str(e)

我想要一些getrsslinks也是芹菜任务的东西,然后删除getrsslinks返回的网址列表也应该是另一个芹菜任务。

遵循这种模式

harcodeJSONURL1--
               --`getrsslinks` (celery task)
                               --scrap link 1 (celery task)
                               --scrap link 2 (celery task)
                               --scrap link 3 (celery task)
                               --scrap link 4 (celery task)

harcodeJSONURL2--
               --`getrsslinks` (celery task)
                               --scrap link 1 (celery task)
                               --scrap link 2 (celery task)
                               --scrap link 3 (celery task)
                               --scrap link 4 (celery task)

依旧......

我该怎么做?

1 个答案:

答案 0 :(得分:1)

看看Celery中的subtask options。在你的情况下,小组应该帮助。您只需在scrape_link内拨打getrsslinks群组。

from celery import group

@app.task
def getrsslinks(rsslink, json_id, category):
    # do processing

    # Call scrape links
    scrape_jobs = group(scrape_link.s(link, json_id, category) for link in link_list)
    scrape_jobs.apply_async()
    ...

您可能希望getrsslinks返回scrape_jobs以更轻松地监控作业。然后在解析你的json文件时,你会像这样调用getrsslinks

for each_news_source, news_categories in rss_obj.iteritems():
    for each_category in news_categories:
        category = each_category['category']
        rss_link = each_category['feed']
        json_id = each_category['json']
        getrsslinks.delay(rss_link, json_id, category)

最后,要监视哪些链接无效(因为我们替换了try / except块),您需要存储所有getrsslinks任务并监视成功或失败。您可以将apply_asynclink_error一起使用。