Python per eseguire in Multiprocessing un altro linguaggio

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
TommyB1992
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 852
Iscrizione: domenica 7 luglio 2013, 15:55
Desktop: GNU/Linux
Distribuzione: Ubuntu 22.04.2 LTS
Sesso: Maschile

Python per eseguire in Multiprocessing un altro linguaggio

Messaggio da TommyB1992 »

Siccome di multithreading/multiprocessing ne so poco, o meglio, li ho usati in Python ma onestamente non sono mai stato un guru e vorrei evitarmi di studiarmeli per il C++, perchè son sicuro uscirebbe un massacro, quindi volevo sapere se ha senso usare Python per eseguire in multiprocessing un altro programma (eseguito più volte), quindi semplicemente lanciare processi in base a CPU/RAM.

Il problema del programma in C++ è che fa tanti calcoli, mettere in parallelo i calcoli è un suicidio, mettere in parallelo l'intero programma e fargli semplicemente fare i calcoli che faresti in sequenza ma tutti insieme invece è fattibile (invece di eseguire programma a con numeri X aspettare la terminazione e poi rieseguirlo con numeri Y per poi aspettare e rieseguire per Z e così via runnare direttamente X/Y/Z).

Oltretutto come faccio a stabilire quanti processi posso lanciare nel caso evitando di farlo decidere al sistema semplicemente osservando CPU/RAM?

Spero di essere stato chiaro e nel caso scrivetemi le perplessità nelle quali non mi sono spiegato che proverò a esserlo di più.

Grazie mille
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2855
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: Python per eseguire in Multiprocessing un altro linguaggio

Messaggio da DoctorStrange »

Non so di preciso quali siano i calcoli che devi fare in parallelo. Potresti comunque pensare di usare Spark core, e gli RDD per questo genere di operazioni. L'idea è questa. Se i tuoi dati rispettano proprietà commutativa ed associativa, Spark ed RDD sono quanto di meglio ci sia. In pratica, se i tuoi dati possono essere elaborati anche in termini di sottoinsiemi casuali, e possono essere calcolati in ordine diverso da quello in cui vengono presentati al cluster, allora sei a posto. L'idea è che l'insieme di dati entrante viene suddiviso in una serie di blocchi di dimensione uguale. Questi blocchi vengono poi consegnati ai vari workers, che si occuperanno di elaborarli separatamente. In funzione del livello di congestionamento dei vari nodi, i risultati delle elaborazioni arriveranno all'edge node in ordine sparso. Per questo motivo, Spark garantisce che le funzioni di aggregazione e calcolo dei dati venga applicata a tutti i dati, ma non nell'ordine in cui questi vengono presentati.
Di solito, all'aumentare del numero di worker, aumenta l'efficienza dell'elaborazione. L'edge node si dovrà poi semplicemente occupare di riordinare i dati presentati.
Non hai bisogno di essere tu stesso a calcolare la saturazione ed il congestionamento dei vari nodi, queste attività di solito so0no delegate ai vari resource manager. In Cloudera questo compito è proprio di YARN (Yet Another Resource Manager) :-) .
Devi quindi orientare il tuo pensiero, non all'hardware, ma ai dati, in maniera tale che questi dati possano essere distribuiti in maniera uniforme su tutti i nodi che hai a disposizione.
Avatar utente
Actarus5
Prode Principiante
Messaggi: 218
Iscrizione: mercoledì 3 luglio 2013, 17:15
Desktop: Mate
Distribuzione: Fedora
Località: Abutalabashuneba

Re: Python per eseguire in Multiprocessing un altro linguaggio

Messaggio da Actarus5 »

Il primo problema che mi viene in mente è che anche se con Python puoi creare un processo per ogni esecuzione del programma ogni processo avrà un solo thread a disposizione.
Purtroppo dovresti modificare il codice in C++ per utilizzare più thread all'interno di ogni processo, altrimenti non so quanto senso abbia il tutto, avresti un multithreading "azzoppato" per così dire.
"An extremely helpful console message: “SPANK! SPANK! SPANK! Naughty programmer!”. Really, I’m not joking about that one."
TommyB1992
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 852
Iscrizione: domenica 7 luglio 2013, 15:55
Desktop: GNU/Linux
Distribuzione: Ubuntu 22.04.2 LTS
Sesso: Maschile

Re: Python per eseguire in Multiprocessing un altro linguaggio

Messaggio da TommyB1992 »

DoctorStrange ha scritto:
martedì 21 febbraio 2023, 12:27
...
Non è la prima volta che mi rispondi in tema ML e si può notare come tu sia certamente competente, il mio problema invece è opposto: io sono un incapace e uso il ML solo come aiuto aggiuntivo al mio lavoro (mi semplifica molte task) perciò la mia formazione non credo mi permetta di comprendere se Spark possa o non possa essermi d'aiuto.

Ho provato a guardare un pò d'esempi online e mi sembra lavorino tutti sui dataset, nel contesto nel quale serve a me io non uso dati, è un principalmente una sorta di algoritmo euristico.

Hai qualcosa da consigliarmi per capire se può risultarmi utile?
Actarus5 ha scritto:
martedì 21 febbraio 2023, 17:07
Il primo problema che mi viene in mente è che anche se con Python puoi creare un processo per ogni esecuzione del programma ogni processo avrà un solo thread a disposizione.
Purtroppo dovresti modificare il codice in C++ per utilizzare più thread all'interno di ogni processo, altrimenti non so quanto senso abbia il tutto, avresti un multithreading "azzoppato" per così dire.
Stai dicendo che eseguire lo stesso programma in multithreading è più conveniente che eseguire lo stesso programma in multiprocessing?

pg.cpp

Codice: Seleziona tutto

void programma() {
 // ...
}

int main() {
  for (int i {0}; i < 10; i++) {
    /* esegui programma() in multithreading */
  }
}
E' più veloce di eseguire con python lo stesso programma ma in multiprocessing?

Scusa se sono ridondante ma voglio capire se ho capito bene.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: Bing [Bot] e 1 ospite