Python 芹菜调用不同的函数并继续链接过程

Python 芹菜调用不同的函数并继续链接过程,python,python-2.7,celery,celery-task,Python,Python 2.7,Celery,Celery Task,我的任务链中有三个任务:获取页面、检查源页面和存储页面 def update_page_info(**headers): chain=fetch_page.s(headers['key']) | check_source.s(headers['key_1']) | store_info.s() chain().apply_async() 获取页面获取页面并收集需要收集的内容: @app.task(bind=True) def fetch_page(self,url):

我的任务链中有三个任务:获取页面、检查源页面和存储页面

def update_page_info(**headers):
    chain=fetch_page.s(headers['key']) | check_source.s(headers['key_1']) | store_info.s()
    chain().apply_async()
获取页面获取页面并收集需要收集的内容:

@app.task(bind=True)
def fetch_page(self,url):
    #fetch_page here and return a tuple so that it can be unpacked
    # dosomething
现在获取页面后,它会在下一个任务中检查源代码check\u source

@app.task(bind=True)
def check_source(self,page_and_url,handle):
    try:
        #unpack your stuffs here
        page,url=page_and_url
        get_result={}

        if handle=='first_option':
            get_result=select_first_option(one,two)
            return get_result

        elif handle=='second_option':
            get_result=select_second_option(one,two)
            return (get_result)

        elif handle=='third_option':
            get_result=select_third_option(one,two)
            return (get_result)
        else:
            return "IGNORE FOR NOW"
    except Exception as exc:
        pass
所以困惑是,我可以从这里调用其他任务吗??是否存在任何不一致性,或者工作人员在执行此操作时是否会陷入死锁

最后,它应该执行store_info(),它只存储从check_source()返回的内容

我采用的是这种方法,只需稍加修改


有谁能告诉我应该怎么做,以及我需要更加小心的事情吗?

这一切都应该像你在阅读(和交流)它一样有效。这三项任务将按顺序执行,没有任何“不一致”

如果调用一次
update\u page\u info
,则三个链接子任务将以独占方式彼此运行。也就是说,这种设置仍有可能出现死锁。如果在上次调用之前的任务正在运行时调用了
update\u page\u info
,则可以同时运行多个任务。这可能会导致死锁,具体取决于任务如何共享资源

如果您的任务共享资源,我建议使用redis或memcached之类的东西作为跨工作人员的锁定系统


编辑:我现在看到的代码非常好,因为结果作为参数传递给下一个任务。

到目前为止,我一直在测试这个及其工作文件,只不过担心如果工作人员过载,我想我需要用更多的任务来测试它。谢谢。测试是一个很好的开始!您的场景是否允许多个工作人员同时执行同一任务?如果这是一个问题,那么您需要确保一次只能执行一个任务。您可以使用芹菜工作者进程共享的互斥/信号量来实现这一点。你到底想做什么?现在我只使用一个工人来执行相同的任务。我计划使用2/3工作者,不知道互斥/信号量。我只是在尝试爬网并保存结果。应该没问题!:)
@app.task(bind=True)
def store_info(self,result):
    print ("store_info ")
    try:
        #store the fetched pages

    except Exception as exc:
        #dosomething
    finally:
        pass