6

セロリを使用したソフトウェア アップグレード システムに取り組んでいます。きれいに実装するのに苦労しているユースケースがあります。ここに私の仕事があります:

device_software_updates(device_id)

returns a list of software updates that need to be installed on a device

installed_device_software(device_id)

returns the software modules that are currently installed on a device

latest_device_software(デバイス ID)

returns the latest software versions available for a device

software_updates(installed_software, latest_software)

returns the latest software modules that are not installed

純粋な python では、device_software_updates の実装は次のようになります。

def device_software_updates(device_id):
    return software_updates(installed_device_software(device_id),
                            latest_device_software(device_id))

Celery 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()
    )()

残念ながら、これは、software_updates の argspec がsoftware_updates(arg_list)理想的ではないことを意味します。

4

1 に答える 1

7

コードを使用するのがこれを処理する正しい方法だと思います。

http://docs.celeryproject.org/en/latest/userguide/canvas.html#groupsにある Celery のドキュメントによると、

コードは、タスクセット内のすべてのタスクの実行が終了した後にのみ実行されるタスクです。

...

コードはグループに似ていますが、コールバックがあります。コードは、ヘッダー グループと本文で構成されます。本文は、ヘッダー内のすべてのタスクが完了した後に実行する必要があるタスクです。

これは、行ごとに分類された例です(Celeryのドキュメントから)

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()
于 2012-08-24T03:46:48.417 に答える