2015-02-05 6 views
0

표준 방법으로 셀러리 작업을 체인화하고 싶습니다.셀러리 작업을 체인화하는 방법

json 파일이 있습니다. 그 파일 안에는 많은 암호화 된 URL이 있습니다. 내가 그 링크를 스크랩하고 그 링크를 스크랩하는 동안 발견되는 링크를 스크랩해야합니다.

현재 저는 이렇게하고 있습니다.

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에 의해 반환 된 URL 목록의 폐기 무언가를 원한다.

이 ..이 패턴

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

셀러리의 subtask options을 살펴보십시오. 귀하의 경우 그룹이 도와야합니다. getrsslinks 안에 scrape_link 그룹으로 전화하면됩니다.

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() 
    ... 

당신은 작업을 쉽게 모니터링 할 수 scrape_jobs을 반환 getrsslinks을 할 수 있습니다. 그런 다음 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) 

, 당신은 모든 getrsslinks 작업을 저장하고 성공 또는 실패를 감시 할 필요가 (우리가/except 블록은 try 교체 이후) 무효 된 링크를 모니터링 할 수 있습니다. 이 경우 apply_asynclink_error을 사용할 수 있습니다.

관련 문제