Come è possibile eseguire la pipeline di due flussi di lavoro sequenziali in cui vi è spazio per la sovrapposizione nei processi?

0

Interromperò questo post in due parti, perché sto cercando di astrarre il concetto, ma alla fine spiegherò la mia implementazione.

Ho due flussi di lavoro, Flusso di lavoro A e Flusso di lavoro B. Parte del flusso di lavoro B si basa sui risultati del flusso di lavoro A. Possono essere eseguiti in sequenza e funzionano come previsto, ma desidero eseguirne la pipeline. Voglio che la prima metà di B si verifichi parallelamente ad A. Ciò significa che a un certo punto in B devo aspettare i risultati di completamento di A. Quale sarebbe il modo migliore di gestirlo?

Per quanto riguarda il mio caso di utilizzo effettivo, sto scrivendo uno script di aggiornamento, ed è composto da due parti.

A.) Disinstalla alcune applicazioni esistenti (non aggiornate)

B.) Scarica e reinstallali

La porzione Download può verificarsi in parallelo con la parte di rimozione. Voglio chiamare entrambi allo stesso tempo, ma ho B aspettare di reinstallare le app fino a dopo che A ha rimosso con successo le versioni precedenti. Quale sarebbe il modo migliore per farlo?

Cosa ho considerato

Rompere la porzione "Download" e "Reinstalla" di B in due parti. Questo ha senso dal punto di vista della pipeline, ma se renderò pubblicamente disponibile la parte "Reinstalla" causerà problemi se la parte "download" non viene eseguita per prima.

Passare l'oggetto Task che comprende la parte "disinstallare alcune applicazioni esistenti" nella parte "download and reinstall" e attendere il suo completamento, che soddisfa l'iniezione della dipendenza (come nel caso, il processo B dipende dal completamento del processo A) ma sembra disordinato

    
posta Sidney 17.10.2017 - 18:23
fonte

1 risposta

3

Per formalizzare la condizione (invariante) nel momento in cui avviene la sincronizzazione:

  • L'installazione della nuova applicazione può iniziare, se tutte queste sono vere:
    • Che non vi è alcuna ostruzione causata da un'installazione preesistente dell'applicazione (vecchia) o in particolare:
      • La vecchia applicazione non era in esecuzione
      • Né il programma di installazione né il programma di disinstallazione specifici per la vecchia applicazione erano in esecuzione
      • I percorsi di installazione (obiettivi) per la vecchia applicazione non sono ostruiti
    • Che il pacchetto di installazione per la nuova applicazione è pronto per l'uso o in particolare:
      • Che è stato scaricato
      • Che il file scaricato ha un buon risultato (non troncato)

Per evitare che i tuoi utenti API (incapaci o maliziosi, a seconda del loro stato d'animo) utilizzino erroneamente la parte "Reinstalla", puoi semplicemente ricontrollare i requisiti come descritto sopra.

Preferirei la separazione dei passaggi di download e di reinstallazione.

Non sono sicuro del motivo per cui considereresti il download e la reinstallazione concettualmente più strettamente correlati. La mia ipotesi è che, si potrebbe pensare che la disinstallazione è un'attività condizionale che dipende dal fatto che esista un'installazione precedente.

Posso offrire un controprogetto per dimostrare che il download può anche essere un compito condizionale. Supponiamo che l'utente abbia già eseguito gli script una volta, in modo tale che il pacchetto di installazione più recente sia già stato scaricato. Tuttavia, l'utente ha annullato l'installazione, ma ha deciso di conservare il pacchetto di installazione scaricato. Ora, se l'utente esegue nuovamente lo script, non dovrebbero verificarsi né la disinstallazione né il download. Lo script dovrebbe saltare direttamente all'installazione della nuova applicazione.

Se intendi crearne uno di Task (ovvero conosciuto anche come Future in altre lingue), è meglio rendere il più semplice a essere il Task .

In questo caso, scaricare un file è il compito più semplice, perché il risultato può essere espresso in modo pulito come riuscito (il file è lì e il suo checksum è valido), o fallito (per qualsiasi motivo, tra cui nessuna connessione Internet o timeout ). L'unica parte non pulita sul download di un file è la pulizia successiva.

    
risposta data 17.10.2017 - 21:06
fonte

Leggi altre domande sui tag