Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 芹菜:可以从内部函数创建任务吗?_Python_Celery_Celery Task - Fatal编程技术网

Python 芹菜:可以从内部函数创建任务吗?

Python 芹菜:可以从内部函数创建任务吗?,python,celery,celery-task,Python,Celery,Celery Task,我有一个芹菜任务: @task def foo(): part1() part2() part3() …我正在分解成一系列子任务 @task def foo(): @task def part1(): ... @task def part2(): ... @task def part3(): ... chain(part1.s(), part2.s(), part3.s()).delay() 子任务是内部函数,因为我不希望

我有一个芹菜任务:

@task
def foo():
  part1()
  part2()
  part3()
…我正在分解成一系列子任务

@task
def foo():
  @task
  def part1():
    ...

  @task
  def part2():
    ...

  @task
  def part3():
    ...

  chain(part1.s(), part2.s(), part3.s()).delay()
子任务是内部函数,因为我不希望它们在父任务的上下文之外执行。问题是我的工作人员没有检测和/或注册内部任务(我正在使用
autoregister
来发现应用程序和任务模块)。如果我将它们移出到模块中与父任务
foo
相同的级别,则工作正常


芹菜是否支持内部功能作为任务?如果是这样,我如何让工作人员注册它们?

代码的问题是,每次调用
foo()
时,您都会得到
part1
的新定义。还请注意,在调用
foo
之前,不会创建单个
part1
函数,因此芹菜在初始化worker时不可能注册要创建的
part
函数中的任何一个

我认为下面的代码最接近你想要的

def make_maintask():
    @task
    def subtask1():
        print("do subtask")

    # ...

    @task
    def _maintask():
        chain(subtask1.si(), subtask2.si(), subtask3.si()).delay()

    return _maintask


maintask = make_maintask()
通过这种方式,
子任务的每个定义以及这样的定义从外部是不可见的

一些评论
  • 如果您只想隐藏
    子任务
    ,请三思。python语言的设计者并不认为需要像java中那样的访问控制,比如公共和私有。这是一种功能,它严重地使一种语言复杂化,其优势令人怀疑。我认为组织良好的包和模块以及良好的名称(比如在前面添加下划线)可以解决所有问题

  • 如果maintask
所做的一切都是将子任务委托给其他子流程,那么实际上不需要将其定义为芹菜任务。除非你真的需要,否则不要让一个芹菜任务调用另一个芹菜任务


代码的问题是,每次调用
foo()
时,都会得到
part1
的新定义。还请注意,在调用
foo
之前,不会创建单个
part1
函数,因此芹菜在初始化worker时不可能注册要创建的
part
函数中的任何一个

我认为下面的代码最接近你想要的

def make_maintask():
    @task
    def subtask1():
        print("do subtask")

    # ...

    @task
    def _maintask():
        chain(subtask1.si(), subtask2.si(), subtask3.si()).delay()

    return _maintask


maintask = make_maintask()
通过这种方式,
子任务的每个定义以及这样的定义从外部是不可见的

一些评论
  • 如果您只想隐藏
    子任务
    ,请三思。python语言的设计者并不认为需要像java中那样的访问控制,比如公共和私有。这是一种功能,它严重地使一种语言复杂化,其优势令人怀疑。我认为组织良好的包和模块以及良好的名称(比如在前面添加下划线)可以解决所有问题

  • 如果maintask
所做的一切都是将子任务委托给其他子流程,那么实际上不需要将其定义为芹菜任务。除非你真的需要,否则不要让一个芹菜任务调用另一个芹菜任务


我不知道不建议在任务中调用
delay()
。我认为这是必要的,尤其是在使用画布时,画布在任务中的价值确实有限,除非对其调用
delay()
。文档没有明确说明客户/员工的区别。你能给我指出一个不建议在任务中调用异步任务的参考吗?@Neil抱歉,我找不到关于这个主题的温和介绍。也许会有帮助,但我认为学习这些东西的最好方法是玩一玩。您可以让您的函数打印一些值并观察它们。我想将任务分解为并行执行的子任务,以避免单个长时间运行的任务。但我也不想将单个任务的所有逻辑部分公开给“客户机”,让它们独立运行。因此,我假设一个可接受的模式是从其他任务中调用异步任务。我使用芹菜已有一段时间了,并且一直遵循从其他异步任务中调用异步子任务的方法。我没有观察到芹菜方面的行为问题。这就是为什么我对你的评论感到惊讶,并想看看是否有记录在案。在其他SO问题中也有很多这种模式的例子,尽管芹菜医生在这方面似乎并不明确other@Neil那么,您确定要使用
chain
来并行化您的任务吗?我不认为
chain
可以做到这一点。我不知道在任务中调用
delay()
是不推荐的。我认为这是必要的,尤其是在使用画布时,画布在任务中的价值确实有限,除非对其调用
delay()
。文档没有明确说明客户/员工的区别。你能给我指出一个不建议在任务中调用异步任务的参考吗?@Neil抱歉,我找不到关于这个主题的温和介绍。也许会有帮助,但我认为学习这些东西的最好方法是玩一玩。您可以让您的函数打印一些值并观察它们。我想将任务分解为并行执行的子任务,以避免单个长时间运行的任务。但我也不想将单个任务的所有逻辑部分公开给“客户机”,让它们独立运行。因此,我假设一个可接受的模式是从其他任务中调用异步任务。我使用芹菜已有一段时间了,并且一直遵循从其他异步任务中调用异步子任务的方法。我没有观察到芹菜方面的行为问题。这就是为什么我对你的评论感到惊讶,并想看看是否有记录在案。在其他SO问题中也有很多这种模式的例子,尽管芹菜医生在这方面似乎并不明确other@Neil那么,您确定要使用
chain
来并行化您的任务吗?我认为连锁店不能做到这一点。。