如何将匿名函数传递给 Celery 任务? (或者以其他方式实现我的目标?)
How can I pass an anonymous function to a Celery task? (Or accomplish my goal some other way?)
我有一个文件下载 Celery 任务。我的主应用程序中不止一种方法将使用此任务,我正在尝试将其抽象化,以便可以将相同的任务用于不同的目的。在我的任务中,有一次我
if r.ok:
results = [result for result in r.json()['ResultSet']['Result']
if all([condition(result) for condition in conditions])]
我以为我会很聪明并通过它
conditions=[lambda result: 'json' not in result['Name']]
只有我不能,因为这会给我一个错误,告诉我函数类型的对象不可序列化。
目前,我已将任务中的行更改为:
if r.ok:
results = [result for result in r.json()['ResultSet']['Result']
if all([excluded not in result[attr] for attr, excluded in exclusions.items()])]
我通过了exclusions={'Name':'json'}
。
如果我开始出于其他原因想要排除文件,而不是响应的某些方面没有特定的文本字符串,那将是一件令人沮丧的事情。我想知道是否有人对我高度通用的条件参数的可序列化版本有任何想法。
完成此操作的唯一方法是将您想要 运行 的函数的名称作为字符串传递,并在您的工作人员中存在一组预定义的函数,以便他们知道要 运行.你对分布式系统的要求太高了。
我有一个文件下载 Celery 任务。我的主应用程序中不止一种方法将使用此任务,我正在尝试将其抽象化,以便可以将相同的任务用于不同的目的。在我的任务中,有一次我
if r.ok:
results = [result for result in r.json()['ResultSet']['Result']
if all([condition(result) for condition in conditions])]
我以为我会很聪明并通过它
conditions=[lambda result: 'json' not in result['Name']]
只有我不能,因为这会给我一个错误,告诉我函数类型的对象不可序列化。
目前,我已将任务中的行更改为:
if r.ok:
results = [result for result in r.json()['ResultSet']['Result']
if all([excluded not in result[attr] for attr, excluded in exclusions.items()])]
我通过了exclusions={'Name':'json'}
。
如果我开始出于其他原因想要排除文件,而不是响应的某些方面没有特定的文本字符串,那将是一件令人沮丧的事情。我想知道是否有人对我高度通用的条件参数的可序列化版本有任何想法。
完成此操作的唯一方法是将您想要 运行 的函数的名称作为字符串传递,并在您的工作人员中存在一组预定义的函数,以便他们知道要 运行.你对分布式系统的要求太高了。