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 шт):
В параметре 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).