2011-11-25 10 views
5

Ho un set di attività parzialmente ordinato, in cui per ogni attività devono essere eseguite tutte le attività che prima dell'ordinamento parziale nell'ordine parziale prima di poter essere eseguite. Voglio eseguire attività che non sono correlate (né prima né dopo l'altra) contemporaneamente per cercare di ridurre al minimo il tempo di esecuzione totale, ma senza avviare un'attività prima che le sue dipendenze siano completate.Come si elabora un ordine parziale di attività contemporaneamente utilizzando Perl?

Le attività verranno eseguite come processi figlio (non perl).

Come devo affrontare la risoluzione di un problema come questo utilizzando Perl? Quali strutture di controllo della concorrenza e strutture dati sono disponibili?

+0

Un cheat: puoi anche scrivere un Makefile per descrivere le dipendenze e fare ad es. 'make -j 4' per un massimo di 4 operatori contemporanei. – Dallaylaen

risposta

1

Vorrei utilizzare un hash di array. Per ogni attività, tutte le sue Propedeuticità saranno menzionati nella matrice corrispondente:

$prereq{task1} = [qw/task2 task3 task4/]; 

vorrei tenere le attività completate in un hash diverso, e poi basta

my @prereq = @{ $prereq{$task} }; 
if (@prereq == grep exists $completed{$_}, @prereq) { 
    run($task); 
} 
1

Sembra una soluzione completa è NP-complete.

Come per una soluzione parziale, Vorrei utilizzare alcune forme di conteggio di riferimento per determinare quali operazioni sono pronti per l'esecuzione, Forks::Super::Job per eseguire i processi di fondo e verificare il loro stato e POSIX::pause Dormire quando viene generato il numero massimo di lavori.

Nessun thread è coinvolto poiché hai già a che fare con processi separati.

Leggere il primo collegamento per possibili algoritmi/euristica per determinare le priorità dei lavori eseguibili.

Problemi correlati