Esecuzione di script in parallelo in base all'albero delle dipendenze

1

Abbiamo un'app che utilizza uno stack abbastanza semplice (Linux, PHP, Oracle, Shell Scripts, ecc.)

Abbiamo una serie di script che devono essere eseguiti:

  • /scr/app1/start.sh
  • /scr/app2/start.php
  • /scr/app3/kickoff.py
  • /scr/app4/test.sh

Le regole di dipendenza sono le seguenti:

  • app1 deve essere eseguito prima
  • app2 quindi deve essere eseguito successivamente
  • app3 e app4 possono essere eseguiti in parallelo

Detto questo, sto cercando di catturare quanto segue da TUTTI gli script:

  • exit codes (utilizzato per determinare il successo di failure / breakage of chain)
  • standard out e / o errore standard

La soluzione non deve necessariamente essere scritta in PHP, deve solo funzionare. Node.js / io.js è parte del nostro stack di build, quindi siamo a nostro agio nel costruire lì.

Fondamentalmente il parallelismo è la vera sfida che vedo. Qual è l'approccio migliore a questo problema soddisfacendo tutti i requisiti?

    
posta Avindra Goolcharan 04.03.2015 - 02:03
fonte

3 risposte

1

Puoi scrivere uno script di shell per farlo.

  1. Avvia app1 e reindirizza lo stdout e lo stderr in un file. Controlla il codice di uscita, se fallito, esci.
  2. Come sopra.
  3. per eseguire app3 e app4 in parallelo, puoi eseguirlo in background. Per acquisire l'output e restituire i codici, dovresti dare un'occhiata a bash coproc ( link ). Reindirizza le uscite per separare i file, in modo che non si incasinino, in seguito puoi concatenarli se lo desideri.
risposta data 04.03.2015 - 09:12
fonte
0

Quindi il modo "PHP" per farlo è tramite l'estensione pcntl (Controllo processo). Questa estensione NON è supportata su Windows, quindi deve essere utilizzata solo in ambienti * nix.

Detto questo, pcntl_fork è dove si trova la magia. Anche se esiste un'estensione di terze parti per threading (rispetto a forking ) in PHP, non è ufficialmente supportata, non è ben testata e non viene sviluppata attivamente. Io, non usarlo.

Il forking sembra avere il proprio set di problemi (puoi google biforcarsi contro threading), ma tutto intorno, è il modo più semplice e più semplice / manutenibile per fare il calcolo parallelo.

Sto scrivendo una libreria che sfrutta symfony / process per eseguire i processi e ottenere il buffer. In precedenza, ho utilizzato una risposta StackOverflow a in modo sicuro, eseguendo in modo asincrono un processo senza alcun blocco in PHP . Ma lo sostituirò con symfony / process e modificherò questa risposta con un link GitHub quando lo pubblicherò.

Per quanto riguarda la catena di dipendenze, la libreria su cui sto lavorando prende un oggetto json (per mantenere le cose il più semplici possibile), che descrive la sequenza di processi da eseguire, incluso quale eseguire in parallelo.

    
risposta data 05.03.2015 - 03:24
fonte
0

Utilizzerei node.js per avviare ciascuna delle attività che devono essere eseguite e gestirò il sequenziamento parallelo delle cose con una libreria promessa come Q .

Con Q, puoi sostanzialmente dire:

1) Fai tutte queste cose nello stesso momento e fammi sapere quando hai finito con tutte loro

2) Quindi, ora che hai finito tutte quelle cose, fai qualcos'altro da solo o nello stesso momento di altre cose (la mia scelta)

Puoi continuare a concatenare in questo modo, e ogni "roba del collegamento a catena" viene eseguito approssimativamente in parallelo, ma non viene avviato nulla finché non sono state completate tutte le attività prerequisite.

Scorri questa pagina per alcuni esempi: link

    
risposta data 02.04.2015 - 10:25
fonte

Leggi altre domande sui tag