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
Python per eseguire in Multiprocessing un altro linguaggio
-
- Scoppiettante Seguace
- Messaggi: 852
- Iscrizione: domenica 7 luglio 2013, 15:55
- Desktop: GNU/Linux
- Distribuzione: Ubuntu 22.04.2 LTS
- Sesso: Maschile
- DoctorStrange
- 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
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.
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.
- 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
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.
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."
-
- 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
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?
Stai dicendo che eseguire lo stesso programma in multithreading è più conveniente che eseguire lo stesso programma in multiprocessing?Actarus5 ha scritto: ↑martedì 21 febbraio 2023, 17:07Il 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.
pg.cpp
Codice: Seleziona tutto
void programma() {
// ...
}
int main() {
for (int i {0}; i < 10; i++) {
/* esegui programma() in multithreading */
}
}
Scusa se sono ridondante ma voglio capire se ho capito bene.
Chi c’è in linea
Visualizzano questa sezione: Bing [Bot] e 1 ospite