Il costrutto fork vs join

Tecnica mediante la quale possiamo suddividere un processo, come già abbiamo fatto, e ricongiungerlo alla fine per usare i risultati calcolati.

Nella programmazione parallela il fork join è un modello mediante il quale possiamo parallelizzare ed eseguire programmi paralleli, meglio ancora eseguire rami dei programmi in parallelo, individuando punti del programma in cui si può suddividere l’esecuzione (il fork) in parallelo per poi riunirli (il join) e riprendere l’esecuzione sequenziale. Le sezioni parallele vedremo possono suddividersi ulteriormente per suddividere un compito al livello di grana più fine.

L’esempio è volutamente semplice due operazioni aritmetiche nelle rispettive parentesi, non correlate tra di loro, ovvero che non dipendono l’una dall’altra e possono quindi essere eseguite in parallelo senza che una necessiti del risultato dell’altra. Sarà invece il prodotto che verrà eseguito in modo sequenziale al termine delle due parentesi e di aver quindi prelevato i loro risultati in un unico flusso di esecuzione.

Le rispettive parantesi le calcoliamo all’interno di due funzioni senza parametri per rendere più leggibile il codice e simulare anche un comportamento più realistico a fronte di operazioni e codici più complessi.

'''
Vogliamo eseguire l'operazione 
P= (5+3) * (4-2)
     x       y
'''

import os

def calcolaX():
  print ("Elab. parallela x=5+3")
  x = 5 + 3
  return x

def calcolaY():
  print ("Elab. parallela y=4-2")
  y = 4-2
  return y

#programma principale
if __name__== "__main__":
  pid = os.fork()
  if pid == 0:
    print ("Sono il figlio")
    x = calcolaX()
    os._exit(x)
  else:
    #sono il padre
    y = calcolaY()

  '''
  faccio il join: ovvero ricongiungo
  i risultati prelevando il calcolo
  fatto dal figlio. Il padre ovviamente deve aspettare che il figlio finisca
  Il frammento di codice sottostante è eseguito dal padre
  '''

  pid,status = os.wait()
  x = os.WEXITSTATUS(status)
  P = x * y
  print("P= " + str(P))

Ultima modifica 17 Gennaio 2022