Как запустить объект в виде потока, если использовать модуль 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 шт):

Автор решения: CrazyElf
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 запущенному потоку, иначе он закончится вместе с основной программой, возможно, даже не успев толком запуститься.

→ Ссылка
Автор решения: gil9red

В 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")
→ Ссылка