Python 结合芹菜的工作成果
我正在用芹菜做一个软件升级系统。我有一个用例,我正在努力干净地实现它。以下是我的工作: 设备软件更新(设备id) 已安装的设备软件(设备id) 最新的设备软件(设备id) 软件更新(已安装软件、最新软件) 在纯python中,设备软件更新的实现可能如下所示Python 结合芹菜的工作成果,python,python-2.7,celery,Python,Python 2.7,Celery,我正在用芹菜做一个软件升级系统。我有一个用例,我正在努力干净地实现它。以下是我的工作: 设备软件更新(设备id) 已安装的设备软件(设备id) 最新的设备软件(设备id) 软件更新(已安装软件、最新软件) 在纯python中,设备软件更新的实现可能如下所示 def device_software_updates(device_id): return software_updates(installed_device_software(device_id),
def device_software_updates(device_id):
return software_updates(installed_device_software(device_id),
latest_device_software(device_id))
在芹菜3.0中实现这一点最干净的方法是什么?我想用小组做些事情。我当前的实现如下所示:
def device_software_updates(device_id):
return (
group(installed_device_software.s(device_id),
latest_device_software.s(device_id)) |
software_updates.s()
)()
不幸的是,这意味着软件更新的argspec是software\u updates(arg\u list)
,这并不理想。我认为使用chord将是正确的处理方法
根据西芹的记载
和弦是一个任务,它只在一个和弦中的所有任务之后执行
任务集已完成执行
和弦就像一个组,但有回调。和弦包括
标题组和正文,其中正文是应
在标头中的所有任务完成后执行
下面是一个逐行分解的示例(来自芹菜文档)
在您的情况下,您可以做类似的事情,例如:
@celery.task
def device_software_updates():
callback = software_updates.subtask()
header = [
installed_device_software.subtask(device_id),
latest_device_software.s(device_id)
]
result = chord(header)(callback)
return result.get()
永远不要从任务内部调用result.get(),否则可能会出现死锁。
returns the latest software modules that are not installed
def device_software_updates(device_id):
return software_updates(installed_device_software(device_id),
latest_device_software(device_id))
def device_software_updates(device_id):
return (
group(installed_device_software.s(device_id),
latest_device_software.s(device_id)) |
software_updates.s()
)()
callback = tsum.subtask()
header = [add.subtask((i, i)) for i in xrange(100)]
result = chord(header)(callback)
result.get()
@celery.task
def device_software_updates():
callback = software_updates.subtask()
header = [
installed_device_software.subtask(device_id),
latest_device_software.s(device_id)
]
result = chord(header)(callback)
return result.get()