DOMANDA [Python] Script in parallelo

OttoOtti

Nuovo Utente
83
7
:search:
Eccomi di nuovo con una nuova domande :thanks:, vorrei sapere se mi conviene visto che non sono un esperto di python eseguire 4 script in parallelo ognuno formato da vari moduli . ci sono delle controindicazioni nel fare questo ? se si quali ?

spiegazione più approfondita :

ho 4 script ogni script e formato interamente da moduli chiameremo questi script A,B,C,D

A si occupa di trasformare un immagine in una matrice di dati
B si occupa di controllare i dati che gli passa A
C si occupa di elaborare i dati di B
D si occupa di controllare C

vorrei eseguire questi script i modo parallelo assegnando uno script a 1 core ogni script per un totale di 4 core per 4 script come ho detto uno script è formato da una decina di moduli ci sono controindicazioni per un programma strutturato come il mio ? se no come posso procedere ?
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,923
11,563
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
per come hai descritto il problema gli script devono essere eseguiti nella sequenza A, B, C, D non in parallelo, perché da quanto scrivi ciascuno di essi riceve in input dati che sono stati elaborati (per intero presumo) dallo script precedente. Come fa B ad elaborare i dati di A se A non è terminato? così pure per C e D.
Altrimenti dovresti riformulare tutto il processo di elaborazione-controllo dei dati in un altro modo (sempre che sia possibile) e buttarti nella programmazione multithreading, cosa che non è affatto semplice anche per programmatori già esperti (è piena di trappole e prona ad errori)
 
  • Mi piace
Reazioni: Andretti60

OttoOtti

Nuovo Utente
83
7
diciamo che elabora i dati se presenti seno non fa nulla finché non riceve dati da gli altri script ho visto che utilizzo silo 25% della cpu adesso quindi vorrei velocizzare le cose , attualmente eseguo 4 finestre IDE per script
 
Ultima modifica:

Andretti60

Utente Èlite
6,440
5,091
Ci sono varie considerazioni da fare in quello che chiedi.

Primo, ottimizzare uno script scritto in Python e' come cercare di fare dimagrire un elefante :) Python non e' pensato per essere ottimizzato, per questo si usano librerie che sono scritte in altri linguaggi (tipicamente in C). Gli script dovrebbero avere meno codice possibile, dovrebbero solo chiamare procedure di librerie esterne.

Secondo, i sistemi operativi moderni sono gia' pensati per dividere il peso di uno o piu' programmi dividendo il loro lavoro nei core a disposizione. Cercare di fare l'ottimizzazione "a mano", come si faceva trenta anni fa, e' solo deleterio, a meno che non si sappia esattamente cosa fare. Tieni presente che in un calcolatore multi-utente e multi-processo, non esistono solo i tuoi programmi che girano, ma moltissimi altri, per cui un programmatore non conosce a priori il carico di ciascun core.

Terzo, molto raramente un programma usera' il 100% della CPU, anzi molto raramente superera' il 80%. Per molti motivi. Un motivo e' quello che ho detto prima: non e' il solo programma che gira, ma piu' semplicemente un programma NON esegue solo istruzioni di calcolo, bensi' passa molto tempo (almeno in termini da computer) ad aspettare che il dispositivo che usa sia pronto. Per esempio, se leggi da file il lavoro della CPU sara' praticamente zero in quanto tutto il lavoro e' nel fare una richiesta di dati al disco e poi aspettare un interrupt dal disco stesso che avvisi quando il dato e' pronto. Ti faccio un esempio, vedi immagine allegata. Uno dei miei programmi piu' grossi visualizza dati in tempo reale che vengono letti o dal computer locale o da un computer in rete o da un database, migliaia di dati al secondo, visualizzati in modo diversi da decine di interfacce grafiche: praticamente non fa uso alcuno della CPU (meno del 25%, quando ne usa di piu' mi preoccupo), come pure poco uso di memoria, la maggior parte delle risorse che usa sono oggetti GDI.
 

Allegati

  • Capture.JPG
    Capture.JPG
    12.5 KB · Visualizzazioni: 150

OttoOtti

Nuovo Utente
83
7
capito e se ci mette troppo tempo per eseguire un script circa un minuto e io vorrei faro eseguire in un secondo come posso fare ? prendo più cpu ?
 
  • Mi piace
Reazioni: fabio93

pabloski

Utente Èlite
2,868
916
Sul serio, da come hai descritto il problema, si tratta di un'esecuzione totalmente sequenziale. Se ogni script ha bisogno dell'output dello script precedente, a che pro metterli in parallelo? Tanto comunque lo script X non può fare niente di utile finchè X-1 non ha terminato.

Riguardo i tempi, hai tre strade possibili: (1) parallelizzare il tuo algoritmo se possibile, (2) aumentare la potenza della cpu cambiandola, (3) usare un altro linguaggio.

Il punto 1 è legato al tipo di attività che fa il tuo programma. Talvolta si può rendere parallelo qualcosa che non lo sembra a prima vista.

Il punto 2 ovviamente implica comprare un altro processore. Non so adesso cosa usi, ma le cpu recenti sono quasi tutte uguali in termini di ipc single thread. Quello che cambia è proprio il maggiore numero di core per i modelli più avanzati e costosi.

Il punto 3 è fattibile solo se non stai usando già librerie ottimizzate, o comunque il lavoro cpu-bound è già svolto totalmente da codice ottimizzato in librerie esterne. Cioè se il 99% del tempo di esecuzione dello script è rappresentato dall'esecuzione di funzioni numpy, è inutile riscrivere il programma in C++ o C, tanto non ci guadagni niente. E peggio ancora, librerie come numpy sono scritte in modo da sfruttare i set d'istruzioni speciali dei nuovi processori ( SSE, AVX e compagnia ). Per cui a mano faresti solo peggio.

E infine, se proprio sei a corto di opzioni, l'unica è optare per qualche altro algoritmo. Spesso le ottimizzazioni algoritmiche sono quelle che danno risultati migliori. Soprattutto quando c'è da fare tanti calcoli su grosse matrici.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili