Potrei pensare a due opzioni, adesso:
-
Come già menzionato nei commenti, crea lock
-files che indica che questo file è già in elaborazione . Se non si desidera sincronizzarlo sul file system, una tabella nel database potrebbe essere un'opzione. L'unico lato negativo qui:
- Se un thread si arresta in modo anomalo prima che possa eliminare il file
lock
, creato, il file correlato viene contrassegnato per sempre come in processo . Forse, è un problema, a seconda delle tue esigenze.
-
Seleziona i file in un modo, in modo che i thread non tenteranno mai di accedere agli stessi file. E.g. potresti dire, c'è un thread responsabile del file che inizia con [a-m]
e un altro thread è responsabile per i file che iniziano con [n-z]
. Un terzo sta gestendo tutti i file da [0-9]
.
Aspetti negativi qui:
- Il carico potrebbe essere distribuito in modo inefficiente, poiché uno dei thread è occupato tutto il tempo e gli altri due sono inattivi, poiché non ci sono file da gestire. Quindi questa è solo un'opzione se puoi stimare la diversificazione dei file.
- Inoltre, se uno dei thread è inattivo, i suoi file non vengono elaborati, poiché gli altri non ne sono responsabili.
[EDIT]
Crea un'istanza di monitoraggio. (ad esempio, un servizio web) Questa istanza ha semplicemente due metodi
-
GetNext(requestId : int) : string
-
%codice%.
Il primo metodo fornisce un percorso al file, che dovrebbe essere elaborato dal richiedente. Ogni percorso viene restituito una sola volta, finché non è scaduto. L'ID del richiedente viene memorizzato con il percorso e il timestamp forniti da qualche parte. Questo è necessario, se un processo di elaborazione dei file è scaduto o se l'istanza di monitoraggio è inattiva per un motivo.
Il secondo metodo è l'istruzione finale del richiedente, in modo che l'istanza di monitoraggio sappia che il file è stato elaborato.
Qui sotto, sicuramente i problemi di configurazione e accessibilità che potresti incontrare. Se l'istanza di monitoraggio centrale è inattiva, i thread dei consumatori devono attendere che sia nuovamente disponibile, poiché è necessario terminare un file prima di procedere con il successivo.