如何解决使用chain EncodeError时的python芹菜错误(RuntimeError(';获取对象的str时超出了最大递归深度))

如何解决使用chain EncodeError时的python芹菜错误(RuntimeError(';获取对象的str时超出了最大递归深度)),python,celery,Python,Celery,既然签名是动态生成的,那么如何在for循环中运行链任务呢。使用以下方法是因为将测试人员任务定义为: @task def tester(items): ch = [] for i in items: ch.append(test.si(i)) return chain(ch)() 如果链太大,这是操作系统或系统特有的,则会引发EncodeError(RuntimeError('获取对象的str时超过最大递归深度',),)的错误 例如,按如下方式调用任务 引

既然签名是动态生成的,那么如何在for循环中运行链任务呢。使用以下方法是因为将测试人员任务定义为:

@task
def tester(items):
    ch = []
    for i in items:
        ch.append(test.si(i))
    return chain(ch)()
如果链太大,这是操作系统或系统特有的,则会引发
EncodeError(RuntimeError('获取对象的str时超过最大递归深度',),)的错误

例如,按如下方式调用任务

引发
EcodeError
。在过去,当物品的长度为5000,即范围(15000)时,我经常会出现这个错误。我通过导入
sys
并在
模块的顶部调用
sys.setrecursionlimit(15000)
修复了这个问题。但是这有一个局限性,所以我决定进行一些重构,并使用下面的方法。这就是尝试将列表分割成一个又一个的块。问题是它在2000年之后似乎不会继续,即测试打印2000到屏幕

@task
def test(i):
    print i


@task
def tester(items):
    ch = []
    for i in items:
        ch.append(test.si(i))
    counter = 1
    if len(ch) > 2000:
        ch_length = len(ch) #4k
        while ch_length >= 2000:
            do = ch[0:2000] # 2k
            print "Doing...NO#...{}".format(counter)
            ret = chain(do)() #doing 2k
            print "Ending...NO#...{}".format(counter)
            ch = ch[2000:] #take all left i.e 2k

            ch_length = len(ch) #2k
            if ch_length <= 2000 and ch_length > 0:
                print "DOING LAST {}".format(counter)
                ret = chain(ch)()
                print "ENDING LAST {}".format(counter)
                break
            else:
                break
            counter +=1
    else:
        ret = chain(ch)()
    return ret
@任务
def测试(一):
打印i
@任务
def测试仪(项目):
ch=[]
对于项目中的i:
总附录(测试si(i))
计数器=1
如果len(ch)>2000:
ch#u长度=len(ch)#4k
当Chu长度>=2000时:
do=ch[0:2000]#2k
打印“正在…不#…{}”。格式(计数器)
ret=链(do)(#做2k
打印“结束…否#…{}”。格式(计数器)
ch=ch[2000:#向左走,即2k
ch#u长度=len(ch)#2k
如果通道长度为0:
打印“正在进行最后一次{}”。格式(计数器)
ret=链(ch)()
打印“结束最后一次{}”。格式(计数器)
打破
其他:
打破
计数器+=1
其他:
ret=链(ch)()
回程网
根据芹菜文档,链基本上是一个接一个地执行其中的任务。我希望while循环在继续之前只在链中完成第一次迭代

我希望有人有这方面的经验,可以帮助


提前祝你圣诞快乐

您似乎遇到了这个问题:

调用
chain(ch)(
似乎也是异步执行的。尝试对其显式调用
apply()

@app.task
def tester(items):
    ch = []
    for i in items:
        ch.append(test.si(i))

    PSIZE = 1000
    for cl in range(0, len(ch), PSIZE):
        print("cl: %s" % cl)
        chain(ch[cl:cl + PSIZE]).apply()
        print("cl: %s END" % cl)
    return None

好极了!这似乎与我提供的实际测试片段一起工作。将看到实际代码将发生什么,然后进行恢复。谢谢,这是一个领先的开始,特别是对于
apply()
我想说的是,在循环中调用
链([t,t,t,…])。apply()
与在循环中调用
t()
是一样的。我的意思是在这种情况下不需要芹菜。你是对的,但我使用这种方法的原因是,在我的实际代码中,test()执行调用其他任务,并在数据库中执行一些CRUD。不管怎么说,我认为如果没有链条,它会起作用
@app.task
def tester(items):
    ch = []
    for i in items:
        ch.append(test.si(i))

    PSIZE = 1000
    for cl in range(0, len(ch), PSIZE):
        print("cl: %s" % cl)
        chain(ch[cl:cl + PSIZE]).apply()
        print("cl: %s END" % cl)
    return None