Как запустить объект в виде потока, если использовать модуль threading в python
from threading import Thread
from time import sleep
class Main(Thread):
def __init__(self):
Thread.__init__(self)
self.start()
def startInfinityCycle(self):
while True:
print("Aaaaaa")
sleep(1)
def Second():
while True:
print("Bbbbbb")
sleep(1)
if __name__ == '__main__':
# main = Main()
# main.startInfinityCycle()
# print("TEST1")
second = Thread(target=Second)
second.start()
print("TEST2")
Если запускать в виде функции, то все верно, и, помимо бесконечного принта, я вижу "TEST2" в консоли. Но если запустить то, что закомментировано, то код стопится на вызове метода у объекта в бесконечном цикле, дальше код не выполняется
Сам вопрос - как заставить работать все это на основе класса?
Ответы (2 шт):
if __name__ == '__main__':
main = Main()
main.startInfinityCycle()
print("TEST1")
Так вы запускаете метод startInfinityCycle без всяких потоков, просто как обычную функцию. Вы её вызываете и ждёте, когда она закончится. Поэтому TEST1 и не печатается - до него не доходит управление в основном потоке программы.
Правильный код:
from threading import Thread
from time import sleep
class Main(Thread):
def __init__(self):
Thread.__init__(self)
self.start()
def run(self):
while True:
print("Aaaaaa")
sleep(1)
if __name__ == '__main__':
main = Main()
print("TEST1")
main.join()
Вывод:
Aaaaaa
AaaaaaTEST1
Aaaaaa
Aaaaaa
Aaaaaa
...
В чём тут дело. Чтобы правильно запустить функцию в классе, унаследованном от Thread, нужно "перегрузить" метод класса run этой функцией. Кроме того, нужно не забывать делать join запущенному потоку, иначе он закончится вместе с основной программой, возможно, даже не успев толком запуститься.
В Thread в потоке будет выполняться только код в методе run, а чтобы поток был запущен так же используется метод start
Пример:
from threading import Thread
from time import sleep
class Main(Thread):
def run(self):
while True:
print("Aaaaaa")
sleep(1)
def Second():
while True:
print("Bbbbbb")
sleep(1)
if __name__ == '__main__':
main = Main()
main.start()
print("TEST1")
second = Thread(target=Second)
second.start()
print("TEST2")