2010-10-31 24 views
2

comment puis-je obtenir variable dans la classe qui est en python remplacer multitraitement:override multitraitement en python

#!/usr/bin/env python 

import multiprocessing 
import os 

class TestMultiprocess(multiprocessing.Process): 
    def __init__(self): 
     multiprocessing.Process.__init__(self) 
     self.myvar = '' 

    def myfunc(self): 
     return os.getpid() 

    def run(self): 
     self.myvar = self.myfunc() 

mlist = [] 
for i in range(10): 
    t = TestMultiprocess() 
    mlist.append(t) 
    t.start() 

for j in mlist: 
    t.join() 
    print t.myvar 

je ne peux pas obtenir la valeur « myvar » de TestMultiprocess de classe, je viens d'obtenir en blanc. Mais je remplace déjà la fonction run() de Process.

désolé si mon sort très mal ...

Répondre

0

t avec j remplacer dans la dernière boucle

for j in mlist: 
    j.join()  # t with j 
    print j.myvar # t with j 

EDIT: et cela ne résoudra pas votre problème

par la voie Si vous voulez obtenir le processus pid, vous n'avez pas besoin de surcharger la méthode run() juste pour ce que vous pouvez faire:

for j in mlist: 
    j.pid 
3

run() sera exécuté dans un processus séparé; les processus ne partagent pas la mémoire, normalement. multitraitement pris en charge par des variables partagées, bien que, par la classe Value explicite:

#!/usr/bin/env python 

import multiprocessing 
import os 

class TestMultiprocess(multiprocessing.Process): 
    def __init__(self): 
     multiprocessing.Process.__init__(self) 
     self.myvar = multiprocessing.Value('i',0) 

    def myfunc(self): 
     return os.getpid() 

    def run(self): 
     self.myvar.value = self.myfunc() 

mlist = [] 
for i in range(10): 
    t = TestMultiprocess() 
    mlist.append(t) 
    t.start() 

for j in mlist: 
    j.join() 
    print j.myvar.value 
+0

je vois .. Mais si j'utilise la valeur ou Array combien de temps octets que je peux enregistrer avec cette variable partagée? parce que je l'essaie avec la réponse d'urllib2 j'obtiens l'erreur "chaîne trop longue" ... –

+0

Vous ne pouvez pas stocker des choses de taille variable dans la mémoire partagée. La mémoire partagée obtient une taille fixe, vous devez utiliser exactement autant de mémoire que vous l'avez initialement allouée. Pour échanger des chaînes entre les processus, je recommande d'utiliser l'interface de file d'attente (qui sera un modèle de programmation différent). –