поток начинает работать до вызова Thread.start

t1=threading.Thread(target=self.read())
print "something"
t2=threading.Thread(target=self.runChecks(), args=(self))

self.read запускается бесконечно, поэтому программа никогда не достигнет строки print. Как это возможно без вызова t1.start()? (Даже если я назову это, оно должно начать работать и перейти к следующей строке, не так ли?)

Ответ 1

Вы передаете результат self.read целевому аргументу Thread. Ожидается, что потоку будет передана функция для вызова, поэтому просто удалите скобки и не забудьте запустить поток:

t1=threading.Thread(target=self.read)
t1.start()
print "something"

Для целей, которым нужны аргументы, вы можете использовать args и kwargs для создания threading.Thread Это также можно использовать лямбда-выражения. Например, чтобы запустить f(a, b, x=c) в потоке, вы можете использовать

thread = threading.Thread(target=f, args=(a, b), kwargs={'x': c})

или же

thread = threading.Thread(target=lambda: f(a, b, x=c))

хотя будьте осторожны, если вы выберете лямбду - лямбда будет искать f, a, b и c во время использования, а не когда lambda определена, поэтому вы можете получить неожиданные результаты, если переназначите любую из этих переменных перед потоком запланировано (что может занять произвольно много времени, даже если вы сразу же позвоните start).