Создание рекурсивных потоков в python - PullRequest
1 голос
/ 02 июля 2011

Я пытаюсь реализовать рекурсивный ряд Фибоначчи, который возвращает значение по индексу. Это домашнее задание, и его нужно выполнять с помощью многопоточности. Это то, что я сделал до сих пор. У меня вопрос, как мне добавить результаты из live_thread1 и live_thread2. Потоки должны быть созданы на каждом уровне рекурсии.

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

Ответы [ 2 ]

4 голосов
/ 02 июля 2011

Это невозможно, потому что вы не можете получить возвращаемое значение функции, выполняемой в другом потоке.

Чтобы реализовать желаемое поведение, вы должны сделать FibonacciThreads вызываемым объектом, который сохраняет результат как переменную-член:

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

Вы можете использовать экземпляры этого класса как функции:

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

Обратите внимание, что, как я сказал в своем комментарии, это не очень разумное использование потоков.Если это действительно ваше задание, то оно плохое.

1 голос
/ 02 июля 2011

Вы можете передать изменяемый объект в поток, чтобы использовать его для сохранения результата.Если вы не хотите вводить новый тип данных, вы можете, например, просто использовать один список элементов:

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]
...