• Benvenuti su RaspberryItaly!
Benvenuto ospite! Login Login con Facebook Registrati Login with Facebook


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5

[-]
Tags
in python passaggio multiprocessi variabili

[Risolto] Python - Passaggio variabili in multiprocessi
#1
Quì di seguito il codice per effettuare due processi contemporaneamente. Non riuscendo a fare ciò di cui ho bisogno ho editato il seguente codice esemplificativo con la dimostrazione del risultato.

Verificando il risultato (Output) si può osservare che:
  • i due processi sono eseguiti entrambi e contemporaneamente (anche se il secondo è partito dopo il primo)
  • il contatore "cont1" si incrementa regolarmente nella funzione "func1"
  • ma sopratutto che la variabile "cont1" non viene passata dalla funzione  "func1" alla funzione "func2" (resta a 0)
Qualche anima pia mi potrebbe illuminare dove sbaglio e come rimediare?

Codice:
from multiprocessing import Process
import sys
rocket1=0
rocket2=0
cont1=0

def func1(cont1):
      global rocket1
      print ('start func1')
      while rocket1 < 500:
          rocket1 += 1
          cont1=rocket1
          print("contatore 1",cont1)
      print ('end func1')

def func2(cont1):
      global rocket2
      print ('start func2')
      while rocket2 < 10:
          rocket2 += 1
          print("Contatore 2 = rocket({}) cont1({})".format(rocket2,cont1))
      print ('end func2')

if __name__=='__main__':
      p1 = Process(target=func1, args=(cont1,))
      p1.start()
      p2 = Process(target=func2, args=(cont1,))
      p2.start()

Output a video:
contatore 1 207
contatore 1 208
start func2
contatore 1 209
Contatore 2 = rocket(1) cont1(0)
Contatore 2 = rocket(2) cont1(0)
contatore 1 210
Contatore 2 = rocket(3) cont1(0)
Contatore 2 = rocket(4) cont1(0)
Contatore 2 = rocket(5) cont1(0)
contatore 1 211
Contatore 2 = rocket(6) cont1(0)
Contatore 2 = rocket(7) cont1(0)
Contatore 2 = rocket(8) cont1(0)
contatore 1 212
Contatore 2 = rocket(9) cont1(0)
Contatore 2 = rocket(10) cont1(0)
contatore 1 213
end func2
contatore 1 214
contatore 1 215
contatore 1 216
Risposta
#2
Nella seconda funzione non definisci cont1 (manca la riga cont1=rocket2 , per capirci).
non la definisci, non la incrementi mai, è normale sia sempre zero.
le variabili di una funzione restano dentro quella funzione (ma questo lo sai, visto che hai usato global)
il cont1 che hai messo a zero all'inizio, non è il cont1 delle funzioni.
però non ho capito cosa vuoi ottenere (e non ho nemmeno mai usato multiprocessing), quindi non so dirti cosa "sbaglI"
Risposta
#3
Grazie Zzed, io volevo che la variabile cont1 della funzione 2 (func2) avesse il valore della variabile cont1 della funzione 1. Insomma devo portare delle variabili da una funzione all'altra. Funzione 1 conta e funzione 2 elabora e stampa.
Risposta
#4
Non si possono condividere così dei dati fra processi (non si può prevedere la contemporaneità).
Il multiprocesso è un discorso molto complesso qui trovi info:

https://docs.python.org/3/library/multip...processing

Mandi

Barbezuan
Risposta
#5
Grazie Barbezuan, vado a leggere le info ma giusto per spiegarmi meglio. Al processo1 volevo dedicare la funzione della raccolta dati (GPS) memorizzare le variabili in liste e quindi tenerle a disposizione per il processo2 che avrebbe il compito di analizzarle.
Il multiprocesso mi sembrava l'ambiente giusto ma DEVE essere possibile un passaggio di variabili......
Se ci sono altre strade devo ancora verificarle ma la mia esperienza non è tanta e me la sto facendo con questo progetto.
Forse si può fare anche in un processo unico ma devo capire come si comportano cronologicamente le singole funzioni (dovrebbero comportarsi indipendentemente fra di loro). Spero di essermi spiegato bene.....

Grazie per ogni suggerimento e...... Mandi anche a te
Risposta
#6
E' possibile, ma credo che le funzioni debbano tornare un risultato al programma principale (comando retutn)
esempio (multiprocessing a parte, per semplicità)
Codice:
import random

def gps(num):
  x = random.randint(1, num)
  y = random.randint(1, num)
  return x,y

def stampa(val):
  print (val)

#main
coord = gps(49)
stampa(coord)
la prima funzione riporta due coordinate (qui messe a caso con numeri da 1 a 50)
il risultato della prima funzione viene passato alla seconda funzione , che stampa le coordinate

trovo comunque macchinoso il multiprocessing applicato così, sopratutto per chi non è esperto. Puoi ottenere la stessa cosa con due script python distinti, da lanciare contemporanemanete (il sistema operativo è multitasking), e che possono scambiarsi i valori scrivendoli e/o leggendoli da un file (magari in RAMDISK) oppure richiamando lo script B direttamente dallo script A, scrivendolo come fosse una libreria (modulo) e mportandolo all' inizio per poterne usare le funzioni da un'altro script.
Risposta
#7
Ecco Zzed, credo tu abbia centrato la situazione cioè come risolvere un problema senza andare a cercare complicazioni.
Essendo ancora ad un livello basso, almeno con il Python, è meglio non cercare rogne.
Avevo intuito che il multiprocessing (chissà per quale ragione) risolvesse egregiamente la mia problematica e grazie a persone in questo forum che si può crescere e capire cose altrimenti non con altrettanta premura.

Nella realtà è la mancanza di conoscenza che fa fare scelte che altrimenti non prenderesti in considerazione. Però dai, potrebbe servire anche ad altri.

Io continuo a studiare il mio problema con le ultime informazioni e mi rivolgerò a voi in caso di ulteriori intoppi.
Intanto metto "risolto" a questa discussione. Blush
Grazie
Risposta
  


Vai al forum:


Navigazione: 3 Ospite(i)
Forum con nuovi Post
Forum senza nuovi post
Forum bloccato
Forum Redirect