Domanda

Sto cercando di eseguire un codice Python in Apache 2.2 / mod_python 3.2.8. Alla fine il codice esegue os.fork () e genera 2 processi separati a lungo termine. Ognuno di questi processi deve creare un'istanza separata di una classe per evitare ogni possibile collisione nel flusso parallelo.

class Foo(object):
   pass

kidprocs = []

for kid in ('kid1', 'kid2'):

  pid = os.fork()
  if pid:
    # parent
    kidprocs.append(pid)
    time.sleep(5)
  else:
    # child

    fooobj = Foo() 
    print "Starting %s in sub-process %s" % (kid, os.getpid())
    print "Kid fooobj: %s" % repr(fooobj) 
    os._exit(0)

for kidproc in kidprocs:
  os.waitpid(kidproc, 0)

Questi output di stampa si presentano così:

Starting kid1 in sub-process 20906
    foo obj: <__main__.Foo instance at 0xb7da5fec>

Starting kid2 in sub-process 20909
    foo obj: <__main__.Foo instance at 0xb7da5fec>

Come puoi vedere, ho ottenuto lo stesso oggetto per entrambi i processi secondari. Hai idea del perché stia andando così in mod_python e c'è comunque un modo per ottenere istanze separate? Grazie mille.

È stato utile?

Soluzione

La posizione di memoria fornita dalla funzione repr () è un indirizzo nella memoria virtuale, non un indirizzo nella memoria globale del sistema. Ciascuno dei tuoi processi restituiti da fork () ha il suo spazio di memoria virtuale che è completamente distinto dagli altri processi. Non condividono la memoria.

Modifica: secondo i commenti di brian di seguito, tecnicamente condividono la memoria fino a quando il kernel non decide di separarli (quando un bambino scrive su una parte della memoria condivisa). Il comportamento, tuttavia, è effettivamente lo stesso.

La struttura dei tuoi programmi è la stessa, quindi python utilizza la stessa posizione di memoria virtuale nell'archivio di memoria virtuale distinto di ogni processo per ciascuno dei tuoi oggetti identici per ogni bambino.

Se in realtà modifichi il contenuto degli oggetti e li provi, vedrai che anche se la posizione della memoria sembra la stessa, i due sono oggetti completamente distinti, perché appartengono a due processi distinti. In realtà non è possibile modificare l'uno dall'altro (senza una sorta di comunicazione tra processi per mediare).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top