Domanda

Abbiamo un sistema che ha solo un interprete. Molti script degli utenti arrivano attraverso questo interprete. Vogliamo mettere un limite all'utilizzo della memoria di ogni sceneggiatura. Esiste solo un processo e quel processo invoca i tasklet per ogni script. Quindi, dal momento che abbiamo solo un interprete e un processo, non conosciamo un modo per mettere un limite su ogni utilizzo della memoria degli script. Qual è il modo migliore per farlo

È stato utile?

Soluzione

Non penso che sia affatto possibile. Le tue domande implicano che la memoria utilizzata dai tasklet sia completamente separata, il che probabilmente non è il caso. Python sta ottimizzando piccoli oggetti come numeri interi. Per quanto ne so, ad esempio ciascuno 3 Nel tuo codice utilizza lo stesso oggetto, il che non è un problema, perché è imutabile. Quindi, se due dei tuoi tasklet usano lo stesso numero (piccolo?), Stanno già condividendo la memoria. ;-)

Altri suggerimenti

La memoria è separata a livello di processo del sistema operativo. Non esiste un modo semplice per dire a quale tasklet e persino a quale thread appartiene un particolare oggetto.

Inoltre, non esiste un modo semplice per aggiungere un allocatore di contabilità personalizzato che analizzerebbe quale tasklet o thread sta allocando un pezzo di memoria e impedire di allocare troppo. Dovrebbe anche collegarsi al codice di raccolta dei rifiuti per scontare gli oggetti che vengono liberati.

A meno che non tu voglia scrivere un interprete di Python personalizzato, usare un processo per attività è la soluzione migliore.

Non hai nemmeno bisogno di uccidere e spawn gli interpreti ogni volta che hai bisogno di eseguire un'altra sceneggiatura. Raccogli diversi interpreti e uccidono solo quelli che crescono in modo eccessivo una certa soglia di memoria dopo aver eseguito una sceneggiatura. Limitare il consumo di memoria degli interpreti per mezzi forniti dal sistema operativo se è necessario.

Se è necessario condividere grandi quantità di dati comuni tra le attività, utilizzare la memoria condivisa; Per interazioni più piccole, utilizzare le prese (con un livello di messaggistica sopra di loro secondo necessità).

Sì, questo potrebbe essere più lento della tua configurazione attuale. Ma dal tuo uso di Python suppongo che in questi script non fai comunque un calcolo critico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top