2011-11-29 12 views
7

In Python, esiste un modo per scoprire su quale CPU è in esecuzione un processo? Ad esempio, se creo processi diversi per attività diverse, utilizzando il modulo multiprocessing, è possibile identificare il nucleo in cui ogni processo è in esecuzione?Programmazione multiprocessore Python

+1

di programmazione o tramite il sistema operativo? Se OS, quindi quale sistema operativo? – jzila

+0

Che cosa intendi per programmazione o sistema operativo? Se intendi attraverso il programma o da fuori, lo voglio all'interno del programma. Ad esempio, posso ottenere l'ID di processo con os.getpid(), posso fare qualcosa di simile per trovare la CPU su cui è in esecuzione quel processo. –

+0

Btw. perché vorresti scoprire il numero di CPU in primo luogo? Cosa stai cercando di ottenere? – jsalonen

risposta

1

Non penso che questo possa essere fatto in modo affidabile in quanto un processo non è limitato a un nucleo. Un processo può essere eseguito su uno o più core (se utilizza thread) e i core utilizzati per eseguirlo possono cambiare nel tempo mentre l'os cerca di bilanciare il carico di lavoro.

Come per un buon modo per ottenere informazioni relative al processo, guarda nella libreria psutil.

3

Risposta breve

No, non è possibile.

Risposta lunga

in una situazione generale non è possibile farlo dal momento che i processi non sono vincolati a nuclei specifici. I processi non hanno CPU fisse su cui è sempre garantita l'esecuzione: spetta al sistema operativo decidere quale core utilizza per eseguire un processo specifico in un momento specifico. Questo processo decisionale è chiamato scheduling e la sua implementazione è specifica per il sistema operativo.

Su determinati sistemi operativi, è possibile controllare, il modo in cui i processori vengono utilizzati per l'espulsione di processi specifici. L'assegnazione dei processori preferiti viene spesso indicata come processor affinity. Anche l'impostazione dell'affinità non garantisce che un processo venga sempre eseguito su determinati core: è in definitiva il sistema operativo (e la CPU) a decidere come eseguire la pianificazione.

Da tutti i SO che conosco, la cosa più vicina che potrei pensare sarebbe il sched_getcpu di Linux che può essere utilizzato "per determinare la CPU su cui è in esecuzione il thread chiamante" (vedere man sched_getcpu). Anche dato che controlli la CPU corrente con questa funzione, il kernel potrebbe cambiare il core subito dopo.

+1

Non so se esiste una soluzione multipiattaforma per gestire l'impostazione e l'interrogazione dell'affinità del processo. Su Windows è possibile impostare l'affinità del processo su un particolare set di core chiamando [SetProcessAffinityMask] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686223%28v=vs.85%29. aspx) con un vettore bit. – eryksun

+0

Non penso che esista neanche. Da PyPi ho trovato 'affinità 0.1.0' (http://pypi.python.org/pypi/affinity), che afferma di fornire wrapper per funzioni di affinità su Windows e alcuni kernel Linux specifici.Non l'ho ancora provato e anche quella libreria non fornirebbe una soluzione completa al problema dato, che di per sé si basa sul malinteso secondo cui i processi sono legati a CPus specifici. – jsalonen

+0

Non vedo il motivo per cui i processi non associati a CPU specifiche non ci consentono di recuperare la CPU su cui vengono eseguiti a intervalli di tempo specifici. Perché non riesco a verificare quale CPU sta eseguendo il mio processo, ad esempio ogni 10 secondi? –

Problemi correlati