2011-07-02 5 views
1

J'essaye d'implémenter une série récursive de Fibonacci qui renvoie la valeur à un index. C'est un devoir et doit être fait en utilisant le multi-threading. C'est ce que j'ai fait jusqu'ici. Ma question est comment puis-je ajouter les résultats de live_thread1 et live_thread2. Les threads doivent être créés à chaque niveau de la récursivité.Création de threads récursifs en python

def Recursive(n): 
    if n< 2: 
     return n 
    else: 
     return Recursive(n- 1) + Recursive(n- 2) 



def FibonacciThreads(n): 
    if n< 2: 
     return n 
    else: 
     thread1  = threading.Thread(target=FibonacciThreads,args=(n-1,)) 
     thread2  = threading.Thread(target=FibonacciThreads,args=(n-2,)) 
     thread1.start() 
     thread2.start() 
     thread1.join() 
     thread2.join() 
     return live_thread1+live_thread2 
+0

Ceci est une affectation très étrange. Pourquoi voudriez-vous démarrer un nouveau thread ne fait rien mais commencer un nouveau thread (ou deux)? –

+0

Vous avez dit que c'est devoirs, donc vous devez le faire. Mais il y a un overhead avec la création d'un fil. Ce code fera __lots__ de threads qui font très peu de travail. Je ne pense pas que ce serait une bonne idée de le faire en code réel. – unholysampler

+0

Ceci est fou, algorithme exponentiel utilisant des discussions? Oh mon Dieu.... – TMS

Répondre

1

Vous pouvez transmettre un objet mutable au thread à utiliser pour stocker le résultat. Si vous ne voulez pas introduire un nouveau type de données, vous pouvez par exemple utiliser une seule liste d'éléments:

def fib(n, r): 
    if n < 2: 
     r[0] = n 
    else: 
     r1 = [None] 
     r2 = [None] 
     # Start fib() threads that use r1 and r2 for results. 
     ... 

     # Sum the results of the threads. 
     r[0] = r1[0] + r2[0] 

def FibonacciThreads(n): 
    r = [None] 
    fib(n, r) 
    return r[0] 
4

Cela n'est pas possible car vous ne pouvez pas récupérer la valeur de retour d'une fonction exécutée dans un autre thread.

Pour mettre en œuvre le comportement que vous voulez, vous devez faire FibonacciThreads un objet appelable qui stocke le résultat comme une variable membre:

class FibonacciThreads(object): 
    def __init__(self): 
     self.result = None 

    def __call__(self, n): 
     # implement logic here as above 
     # instead of a return, store the result in self.result 

Vous pouvez utiliser des instances de cette classe comme des fonctions:

fib = FibonacciThreads() # create instance 
fib(23) # calculate the number 
print fib.result # retrieve the result 

Notez que, comme je l'ai dit dans mon commentaire, ce n'est pas une utilisation très intelligente des discussions. Si c'est vraiment votre mission, c'est une mauvaise chose.