#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()