2010-08-05 4 views
0

J'ai deux définitions ou méthodes en python. J'aimerais les faire fonctionner au même moment. A l'origine j'ai essayé d'utiliser le forking mais comme l'enfant a conservé la mémoire du parent, il écrit plusieurs choses dont je n'ai pas besoin dans un fichier. Donc je suis passé au filetage.Threading en Python

J'ai quelque chose de similaire à

import threading 
class test(threading.Thread) 
    def __init__(self,numA, list): 
      self.__numA=numA # (random number) 
      self.__list=list #(list) 
    def run(self): 
      makelist(self) 
      makelist2(self) 

makelist() et makelist2() utilisation numA et list. Donc, dans ces définitions/méthodes au lieu de dire

print list 

Je dis

print self.__list. 

Dans la main() J'ai fait un objet de classe:

x = test() 
x.start() 

Quand je lance mon programme, je obtenir une erreur d'attribut indiquant qu'il ne peut pas reconnaître le __list ou __numA.

J'ai été bloqué sur cela pendant un moment. S'il y a une autre meilleure façon d'exécuter deux méthodes en même temps (les méthodes ne sont pas connectées du tout), veuillez m'en informer et expliquer comment.

Merci.

+0

Are '' makelist' et méthodes makelist2' de 'test', ou des fonctions distinctes? –

+0

"quelque chose de similaire à" ne nous permet pas de voir quel est le problème. S'il vous plaît montrer votre code que vous exécutez et l'erreur générée. – msw

+0

Je montrerais mon code mais je ne peux pas puisque c'est pour le travail. En outre, j'ai été en mesure de le comprendre. Merci. – ykmizu

Répondre

0

Deux choses:

A) Lorsque vous remplacez la méthode __init__ de l'objet threading.Thread vous devez initialiser threading.Thread vous qui peut être accompli en mettant « threading.Thread .__ init __ (self) B) Comme msw a souligné que ces appels à "makelist" et "makelist2" semblent être des fonctions globales qui un peu vainc le but de l'enfilage. Je recommande de leur faire des fonctions de test.

1

Les listes __list et __numA ne seront pas visibles depuis makelist et makelist2 si elles ne sont pas également membres de la même classe. Le double underscore fera des choses comme ça ne:

>>> class A(object): 
... def __init__(self): 
...  self.__a = 2 
... 
>>> def f(x): 
... print x.__a 
... 
>>> a = A() 
>>> f(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in f 
AttributeError: 'A' object has no attribute '__a' 

Mais, en nommant quelque chose de __Une sans deux traits de soulignement travailleraient. Est-ce ce que vous voyez?

Vous pouvez en savoir plus sur private variables dans la documentation python.

1

Tout d'abord, ne nommez pas votre variable de la même manière que les types ou fonctions intégrés, c'est-à-dire la liste.

Deuxièmement. ainsi que les problèmes que d'autres ont signalés (__ nommer mangling, initialiser Thread etc), si votre intention est de lancer makelist et makelist2 en même temps, alors vous le faites mal, puisque votre méthode run les exécute encore une après L'autre. Vous devez les exécuter dans séparément threads, pas séquentiellement dans le même thread.

Troisièmement, que voulez-vous dire par "même heure exacte"? L'utilisation de threads dans (C) Python est physiquement impossible, puisque l'exécution sera entrelacée au niveau du bytecode.D'autres versions de Python (Jython, IronPython, etc.) peuvent les exécuter exactement au même moment sur un système multicœur, mais même alors, vous n'avez aucun contrôle sur le moment où le planificateur de système d'exploitation va démarrer chacun d'eux.

Finalement, c'est une mauvaise idée de partager des objets mutables entre les threads, puisque si les deux threads changent les données en même temps, alors des choses imprévisibles peuvent (et vont) arriver. Vous devez vous protéger contre cela en utilisant des verrous ou en transmettant uniquement des données immuables ou des copies des données. L'utilisation de verrous peut également causer ses propres problèmes si vous n'êtes pas prudent, comme des blocages.

+0

Merci beaucoup! J'ai fait des fils séparés et cela a fonctionné. – ykmizu

1

Je souhaite les exécuter au même moment.

Vous ne pouvez pas le faire avec threading: le Global Interpreter Lock en Python assure qu'un seul thread peut exécuter du code Python à tout moment (fils sont passés tous les sys.getcheckinterval() bytecode). Utilisez multiprocessing à la place:

from multiprocessing import Process 
import os 

def info(title): 
    print title 
    print 'module name:', __name__ 
    print 'parent process:', os.getppid() 
    print 'process id:', os.getpid() 

def f(name): 
    info('function f') 
    print 'hello', name 

if __name__ == '__main__': 
    info('main line') 
    p = Process(target=f, args=('bob',)) 
    p.start() 
    p.join()