python как одновременно запустить несколько потоков в каждом из которых есть бесконечный цикл?

Помогите найти решение. Я хочу запустить количество потоков равное количеству элементов в списке. Проблема заключается в том, что в классе у меня содержится цикл while True, отказаться от которого я не могу, и сталкиваюсь с ситуацией при которой программа логично останавливается первый раз натолкнувшись на while True и я получаю на вывод :1,1,1,1... Но мне необходимо, что бы в данный момент времени были запущены все потоки(т.е. столько потоков сколько элементов в списке, в каждом из который будет исполнятся свой независящий ни от кого while True), как мне этого достичь ?? мой код:

import threading

a=[1,2]
empty_list=[]
class test():
    def __init__(self,i):
        self.i=i
        self.while_true()

    def while_true(self):
        while True:
            print(self.i)

for i in range (len(a)):
    empty_list.append(a[i])

for i in range (len(empty_list)):
    empty_list[i]=threading.Thread(target=test(a[i]))
    empty_list[i].start()

Ответы (1 шт):

Автор решения: insolor

В параметре target нужно передавать ссылку на функцию (без скобок) или в вашем случае класс (опять же, без скобок), а вы сразу создаете объект, из-за чего сразу стартует бесконечный цикл в основном потоке. Рабочий вариант:

empty_list[i]=threading.Thread(target=test, args=(a[i],))

Через параметр args передается кортеж с позиционными параметрами, которые будут переданы в test при создании объекта. Подробнее см. документацию по Thread.


Еще один вариант - реализовать класс с методом __call__ (тогда объект класса можно будет вызывать как функцию):

class test():
    def __init__(self,i):
        self.i=i

    def __call__(self)
        while True:
            print(self.i)

...

empty_list[i]=threading.Thread(target=test(a[i]))

В этом случае будет создан объект класса, инициализированный нужными параметрами (без старта цикла), передан в Thread, а при создании потока этот объект будет вызван как функция - тогда уже будет вызван метод __call__ созданного объекта, и стартует бесконечный цикл.

Оба варианта с отдельным классом избыточны (излишне усложнены), вместо класса достаточно было создать функцию test, и передать ее Thread по первому варианту (с передачей параметров через args).

→ Ссылка