2015-04-13 34 views
5

Nell'applicazione su cui sto lavorando, un utente può eseguire una "transizione" che consiste in "passaggi". Un passo può avere un numero arbitrario di dipendenze su altri passi. Mi piacerebbe essere in grado di chiamare una transizione e fare eseguire i passaggi in parallelo come attività separate di Celery.Celery: esecuzione di una serie di attività con dipendenze complesse

Idealmente, mi piacerebbe qualcosa sulla linea celery-tasktree, ad eccezione dei grafici aciclici diretti in generale, anziché solo degli alberi, ma non sembra che tale libreria esista ancora.

La prima soluzione che viene in mente è un adattamento parallelo di un ordinamento topologico standard - piuttosto che determinare un ordinamento lineare di passi che soddisfano la relazione di dipendenza, determiniamo l'intero insieme di passaggi che possono essere eseguiti in parallelo al all'inizio, seguito dall'intero insieme di passaggi che possono essere eseguiti nel secondo round e così via.

Tuttavia, questo non è ottimale quando le attività richiedono una quantità di tempo variabile ei lavoratori devono rimanere inattivi in ​​attesa di un'attività più lunga mentre ci sono attività che sono ora pronte per essere eseguite. (Per la mia specifica applicazione, questa soluzione probabilmente va bene per ora, ma mi piacerebbe ancora capire come ottimizzare questo.)

Come indicato in https://cs.stackexchange.com/questions/2524/getting-parallel-items-in-dependency-resolution, un modo migliore è operare direttamente al di fuori del DAG - dopo ogni l'attività termina, controlla se una delle sue attività dipendenti è ora in grado di essere eseguita e, in tal caso, eseguirle.

Quale sarebbe il modo migliore per implementare qualcosa di simile? Non mi è chiaro che esiste un modo semplice per farlo.

Da quello che posso dire, le primitive di gruppo/catena/accordo di Celery non sono abbastanza flessibili da consentirmi di esprimere un DAG completo, anche se potrei sbagliarmi qui?

Sto pensando di creare un wrapper per le attività che notificano le attività dipendenti una volta terminata l'attività corrente. Non sono sicuro di quale sia il modo migliore per gestire tale notifica. L'accesso al database Django dell'applicazione non è particolarmente accurato, e renderebbe difficile farlo girare in una libreria generica, ma Celery stesso non fornisce meccanismi ovvi per questo.

+0

Ho la stessa domanda. Hai trovato qualcosa? – neoascetic

+1

Avere la stessa domanda. Il mio pensiero migliore era di ... non usare Celery: -/Ma, questo mi lascia con la scrittura di molte infrastrutture io stesso. – matthewatabet

+1

Ho aperto un problema github per questo qui: https://github.com/celery/celery/issues/3666 – matthewatabet

risposta

1

Ho anche affrontato questo problema ma non sono riuscito a trovare una soluzione o una libreria migliore ad eccezione di una libreria. Per chiunque sia ancora interessato, è possibile effettuare il checkout https://github.com/selinon/selinon. Anche se è solo per Python 3, sembra essere l'unica cosa che fa esattamente quello che vuoi.

Il flusso d'aria è un'altra opzione, ma il flusso d'aria viene utilizzato in un ambiente più statico, proprio come le altre librerie di dag.

+0

Oh che sembra * sorprendente *. Se solo stavo ancora lavorando presso la società a cui ero impiegato quando ho posto questa domanda :) – ajd