Ho appena scoperto l'opzione di configurazione CELERYD_PREFETCH_MULTIPLIER
(docs). Il valore predefinito è 4, ma (credo) voglio il prefetch off o il più basso possibile. Ho impostato a 1 ora, che è abbastanza vicino a quello che sto cercando, ma ci sono ancora alcune cose che non capisco:Informazioni sul prefetch delle attività di sedano
Perché questo è prefetching una buona idea? Non vedo davvero una ragione per questo, a meno che non ci sia molta latenza tra la coda dei messaggi e gli operatori (nel mio caso, sono attualmente in esecuzione sullo stesso host e, nel peggiore dei casi, potrebbero eventualmente essere eseguiti su host diversi negli stessi dati centro). La documentazione menziona solo gli svantaggi, ma non riesce a spiegare quali sono i vantaggi.
Molte persone sembrano impostare questo a 0, aspettandosi di essere in grado di disattivare il prefetching in quel modo (una supposizione ragionevole a mio parere). Tuttavia, 0 significa prefetching illimitato. Perché qualcuno vorrebbe mai un prefetching illimitato, non elimina del tutto la concorrenza/asincronicità che ha introdotto una coda di attività in primo luogo?
Perché il precaricamento non può essere disattivato? Potrebbe non essere una buona idea per le prestazioni disattivarlo nella maggior parte dei casi, ma esiste una ragione tecnica per cui ciò non è possibile? O è solo non implementato?
A volte questa opzione è collegata a
CELERY_ACKS_LATE
. Per esempio. Roger Hu writes «[...] spesso ciò che [gli utenti] vogliono veramente è che un lavoratore si riservi il maggior numero di compiti quanti sono i processi figli. Ma questo non è possibile senza abilitare i riconoscimenti tardivi [...] »Non capisco come queste due opzioni siano collegate e perché non sia possibile senza l'altra. Un'altra menzione della connessione può essere trovata here. Qualcuno può spiegare perché le due opzioni sono collegate?
Grazie. 2) Ok, ma perché qualcuno dovrebbe voler "nessun limite specifico"? 3) Sono abbastanza sicuro di vedere ancora i messaggi di "Got task from broker" prima che l'attività corrente sia finita. –
AFAIK, l'impostazione del precaricamento su 1 è ** non ** equivalente allo spegnimento. È il valore più basso possibile (pur non hackerando il codice sorgente) per prefetch, che, a sua volta, è il numero di CPU/core nella macchina corrente. –
@RonKlein Non è il numero di CPU/core, è il numero di lavoratori di Celery che hai definito (che in alcuni casi può essere lo stesso, ma di solito non lo è). Inoltre, se ogni lavoratore sta eseguendo il precaricamento di una singola attività, quindi eseguendola, quindi prelettura un'altra, ciò equivale a disattivare il precaricamento, quindi IMHO la tua affermazione non è corretta. (Il sistema deve sempre eseguire il precaricamento di tutte le attività quanti sono i lavoratori se vuole mantenere tutti i lavoratori alimentati con le attività.) – nitwit