RecursionError: максимальная глубина рекурсии превышена при использовании потока - PullRequest
3 голосов
/ 26 октября 2019

Итак, я получаю сообщение об ошибке

[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded

Код, который я запускаю:

import threading

def hello_world(a):
    threading.Timer(2.0, hello_world(a)).start() # called every minute
    print(a)
    print("Hello, World!")

hello_world('a')

Я заметил, что при отсутствии аргументов в функции hello_world ошибка не отображаетсяне происходитНо как только мне нужно передать параметр в функцию, я получаю сообщение об ошибке. Может кто-нибудь объяснить, почему это так и как это исправить?

1 Ответ

4 голосов
/ 26 октября 2019

Конструктор threading.Timer() ожидает, что аргументы функции и будут переданы этой функции в качестве отдельных параметров . Правильный способ вызвать его таков:

threading.Timer(2.0, hello_world, (a,)).start()

Вы можете видеть, что мы ссылаемся на hello_world без его вызова, и мы перечисляем параметры, которые мы хотим передать отдельно, в 1-кортеже (a,).

То, как вы в настоящее время делаете это, оценивает hello_world(a) немедленно, до того, как оно достигнет конца выражения, пытаясь выяснить, какое возвращаемое значение hello_world(a) будет - в отличие от запуска таймера и последующего вычисления выражения каждый раз, когда таймер отключается.

...