Объединение потоков Python3 .start() не создает атрибут объединения

#python #python-3.x #python-multithreading

#python #python-3.x #python-многопоточность

Вопрос:

Это работает нормально:

 def myfunc():
    print('inside myfunc')

t = threading.Thread(target=myfunc)
t.start()
t.join()
print('done')
  

Однако это, по-видимому, при правильном создании и выполнении потока:

 def myfunc():
    print('inside myfunc')

t = threading.Thread(target=myfunc).start()
t.join()
print('done')
  

Генерирует следующую неустранимую ошибку при попадании в join():

Ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘join’

Я бы подумал, что эти инструкции эквивалентны. В чем разница?

Ответ №1:

 t = threading.Thread(target=myfunc).start()
  

объединение потоков.Thread(target=myfunc) возвращает объект thread, однако object.start() не возвращает ничего. Вот почему существует ошибка AttributeError .

Комментарии:

1. Спасибо, имеет смысл. Я думал о том, что каждый из них делает, в отличие от того, что каждый возвращает.

2. @FarNorth Я надеюсь, что у вас уже есть ответ. Thread — это класс в потоковой функции, а start — это функция этого класса. С помощью threading. Создается поток, объект класса, вызывается start() для вызова метода start, который фактически запускает поток.

Ответ №2:

Начиная с Python 3.8 и введения оператора «морж», вы можете использовать: := ;

 (t := threading.Thread(target=myfunc)).start()