2009-04-22 5 views
2

Je Process sous-classé comme ceci:Python multitraitement: Envoi de données à un processus

class EdgeRenderer(Process): 
    def __init__(self,starter,*args,**kwargs): 
     Process.__init__(self,*args,**kwargs) 
     self.starter=starter 

Je définir une méthode qui utilise runself.starter. Cet objet starter est d'une classe State que je définis.

Est-ce que je peux le faire? Qu'arrive-t-il à l'objet? Est-ce qu'il est sérialisé? Cela signifie-t-il que je dois toujours m'assurer que l'objet State est sérialisable? Le nouveau processus obtient-il une copie de cet objet?

Répondre

8

Sur les systèmes Unix, le multiprocessing utilise os.fork() pour créer les enfants, sous Windows, il utilise des manipulations de sous-processus et de sérialisation pour partager les données. Donc, pour être cross plate-forme, oui - il doit être sérialisable. L'enfant aura une nouvelle copie.

Cela étant dit, voici un exemple:

from multiprocessing import Process 
import time 

class Starter(object): 
    def __init__(self): 
     self.state = False 

x = Starter() 

class EdgeRenderer(Process): 
    def __init__(self,starter,*args,**kwargs): 
     Process.__init__(self,*args,**kwargs) 
     self.starter=starter 
    def run(self): 
     self.starter.state = "HAM SANDWICH" 
     time.sleep(1) 
     print self.starter.state 

a = EdgeRenderer(x) 
a.start() 
x.state = True 
a.join() 
print x.state 

Lors de l'exécution, vous verrez:

HAM SANDWICH 
True 

Ainsi, les changements que le parent fait ne pas se communiquer après la fourche() et les changements apportés par l'enfant ont le même problème. Vous devez respecter les limites de la fourchette.

+0

Vous êtes mon héros :-p – fuzzyman

+0

D'accord, je comprends. Mais cela laisse une chose étrange: quand je passe une file d'attente de la même manière que j'ai passé 'starter', cela fonctionne, donc je suppose qu'il n'est pas dupliqué. Alors comment se fait-il qu'un objet normal soit dupliqué mais pas une file d'attente? –

+2

Je suppose que vous parlez d'une multiprocessing.queue, qui est gérée différemment des autres objets, jetez un oeil à: http://svn.python.org/view/python/trunk/Lib/multiprocessing/queues.py? vue = balisage – jnoller

Questions connexes