Voglio implementare una soluzione di backup in Python in cui un server di backup avvia backup su un numero di server virtuali e fisici (un server = un'attività di backup). Ignorando i dettagli delle attività di backup effettive, mi occupo della parte di pianificazione / multiprocessing per ora.
I vincoli che ho sono:
- Esegui il backup di due server contemporaneamente (ad esempio al massimo due thread di backup eseguiti contemporaneamente)
- Non eseguire il backup di due server sulla stessa macchina fisica (spesso più server virtuali condividono una macchina hardware comune) contemporaneamente.
Dato che non ho molta esperienza in multiprocessing in Python mi chiedo quale sarebbe una soluzione Python ottimale. Mi è venuto in mente il seguente:
- Avere un thread per ogni processo di backup (ad esempio per ciascun server) e utilizzare un
threading.BoundedSemaphore
per assicurarsi che solo due siano in esecuzione contemporaneamente. Utilizzare più semafori / condizioni per garantire che più thread non stiano supportando due server sulla stessa macchina fisica. - Hanno esattamente due thread che sono in esecuzione tutto il tempo e recuperano le loro attività da una coda. Contemporaneamente la coda dovrebbe assicurarsi che nessuna attività sulla stessa macchina fisica venga distribuita contemporaneamente (ad esempio saltando / riordinando le attività a volte). Probabilmente lo fare sottoclasse
Queue.PriorityQueue
per aggiungere i vincoli aggiuntivi.
Mi sto appoggiando alla seconda opzione, ma non sono sicuro che una coda sia la giusta struttura dati per distribuire le attività a più thread di lavoro. Non ho bisogno di aggiungere attività alla coda in fase di esecuzione (che una coda consente) e ho bisogno di un po 'di logica per distribuire le attività piuttosto che elaborarle in un ordine lineare. C'è una struttura dati migliore (standard) per questo?
Sarei grato di ascoltare alcuni pensieri dei programmatori più esperti.