Python usa solo un core alla volta per funzionare?


13

Ho notato di recente che Python utilizza solo un core alla volta per funzionare. C'è un modo, forse build o comandi speciali, per farlo usare tutte le risorse (secondo core)?


1
Se stai eseguendo un processo batch per attività ripetute e lo script sta facendo la cosa giusta e utilizza il 100% di un core per fare qualcosa di utile, potrebbe non essere così pericoloso. Inizia un secondo processo che esegue anche l'altro core al 100%. L'effetto lordo può essere migliore rispetto a un processo con thread. La situazione è diversa se si ha solo un compito pesante da elaborare.
user30184

Questo è già in discussione vedi questo thread per maggiori informazioni e soluzioni gis.stackexchange.com/questions/55048/…
iRfAn

Saresti in grado di modificare la tua domanda per chiarire se si tratta di Python in generale o più specificamente di ArcPy (come indicato dai tag), per favore? Se è quest'ultimo puoi includere alcuni dettagli per dimostrare che questo è il caso, ad esempio come lo hai notato?
PolyGeo

Risposte:


15

È possibile utilizzare i sottoprocessi per sfruttare più core all'interno di uno script Python, in modo che diverse attività possano essere eseguite in parallelo. Ma non puoi dividere una singola attività su più core. Leggi una spiegazione dettagliata in questa FAQ: ArcGIS 10 supporta processori multi-core e / o sistemi operativi a 64 bit?

Se sei un utente esperto di Python, potresti essere interessato all'approccio spiegato in questa presentazione utente dal Dev Summit 2014, chiamato Parallel Geoprocessing utilizzando Python Multiprocessing e Critical Path Methodology , tuttavia non ti consentirà di utilizzare diversi core per lo stesso compito.

Altrimenti dovrai aspettare il rilascio di ArcGIS Pro (applicazione a 64 bit) entro la fine dell'anno per testare le prestazioni del multi-threading (o provare subito la Beta)


4

Come alcuni hanno già detto, non esiste supporto per il multiprocessing in ArcGIS Desktop. Quando parlo dell'elaborazione di set di dati GIS in un ambiente desktop, sto cercando di scoprire se posso dividere un grande flusso di lavoro in blocchi più piccoli che verranno calcolati contemporaneamente caricando più core. Quasi tutti i casi dovrebbero essere studiati individualmente poiché i comportamenti degli strumenti GP possono differire in modo significativo.

Pensa a cosa è più veloce da fare quando risolvi un semplice problema di matematica. Qual è il modo più veloce per contare tutti i numeri da 1 a 100?

1) sommando i risultati uno per uno e sommando l'uno con l'altro in modo incrementale (1 + 2 = 3, 3 + 3 = 6,6 + 4 = 10 e così via). Un core sta lavorando su questo compito.

2) dividere i valori in anticipo in singoli blocchi e sommare prima i valori lì (da 1 a 30, da 31 a 60 e da 60 a 100). Tre core funzioneranno contemporaneamente (l'ultimo passo sarebbe quello di sommare tre valori ricevuti).

Poiché diversi strumenti GP sono implementazioni di algoritmi diversi con notazione big-O diversa , probabilmente avresti bisogno di affrontarli in modo diverso in termini di invio di processi multipli.

Un buon punto di partenza sarebbe imparare come funziona la libreria multiprocessing in Python. Uso abbastanza pesantemente.

Ho anche notato che l'esecuzione di script Python da una riga di comando utilizzando Python a 64 bit di solito comporta una corsa più veloce (rispetto alla corsa dell'IDE, ma questo potrebbe non essere il caso sulla tua macchina). Il geoprocessing in background è stato introdotto in 10.1, ma provare a eseguire gli script Python con Python a 64 bit e vedere come le prestazioni sono influenzate.

ArcGIS Pro indicato in un'altra risposta è disponibile in versione beta 5 per il download (tieni presente che dovrai essere un partecipante della comunità Esri Beta per inviare eventuali bug e avere accesso a un account ArcGIS Online per organizzazioni per poter eseguire il Pro).


1

Pypy è una versione conforme di Python che funziona 4-5 volte più velocemente di CPython (il "standard" python).

Se sei abbastanza coraggioso da costruirlo dal sorgente, c'è un ramo che "può eseguire più thread indipendenti affamati di CPU nello stesso processo in parallelo". Ciò significa che ottieni i vantaggi del multi-threading senza dover riscrivere alcun codice.


0

La risposta semplice è no. La risposta migliore è che dipende.

A causa dell'implementazione di CPython (il python più comunemente usato), è sicuro che il tuo Python non possa effettivamente trarre vantaggio dal multithreading. Vedere:

http://en.wikipedia.org/wiki/Global_Interpreter_Lock

https://wiki.python.org/moin/GlobalInterpreterLock

Si noti che IO è immune al GIL.

Ora puoi lavorarci su. Come altri hanno sottolineato, puoi generare sottoprocessi e la libreria multiprocessore può aiutarti.


1
L'I / O è immune, ma lo stesso vale per la maggior parte delle funzioni implementate in C, inclusa la maggior parte degli strumenti GP e tutto in numpy. Il GIL è meno una limitazione negli ambienti GIS pratici di quanto si possa pensare.
Jason Scheirer,

0

Non riesco a risolvere i problemi di ArcGIS, ma per quanto riguarda l'elaborazione di più attività tramite Python, hai considerato un task manager come Celery (celeryproject.org)? Ciò richiederebbe di identificare diverse attività di elaborazione, inviarle a un "responsabile" per la distribuzione, eseguire "lavoratori" che ricevono attività dal gestore, elaborarle e riportare i risultati.

Questo non è banale da implementare, ma ha un'incredibile flessibilità e ti consente di sfruttare appieno la capacità di elaborazione (ad esempio, utilizzare quei core inattivi).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.