Python Цикл до достижения максимального числа - PullRequest
0 голосов
/ 16 января 2020

мой инструмент останавливается случайным образом, и кажется, что все потоки являются «призраками».

Как это работает: инструмент зацикливается, пока не будет запущено максимальное количество одновременно разрешенных потоков, в данном случае 20 Когда поток заканчивается, он начинает следующий.

Проблема: Примерно через час после этого инструмент зависает на 20 потоках, но больше ничего не происходит.

Заранее всем спасибо!

maxthreadcount = 20
while True:
    if threading.active_count() < maxthreadcount:
            threading.Thread(target=Dealer).start()

Дилер:

def Dealer():
  print("thread started")
  return

1 Ответ

0 голосов
/ 16 января 2020

Вам необходимо прекратить ранее созданные потоки после выполнения их задания (в данном случае print).

Взгляните на этот пример из этой статьи :

class CountdownTask: 

    def __init__(self): 
        self._running = True

    def terminate(self): 
        self._running = False

    def run(self, n): 
        while self._running and n > 0: 
            print('T-minus', n) 
            n -= 1
        time.sleep(5) 

c = CountdownTask() 
t = Thread(target = c.run, args =(10, )) 
t.start() 
... 
# Signal termination 
c.terminate()  

# Wait for actual termination (if needed)  
t.join()  

Я думаю, вам следует позвонить self.terminate() после выполнения print. Примерно так:

class Dealer():
    def __init__(self):
        self._running = True

    def run(self):
        print("thread started")
        return self.terminate()

    def terminate(self):
        self._running = False

Редактировать

Я также считаю, что вы можете использовать python ThreadPool для этой степени. Вместо того, чтобы создавать потоки самостоятельно, вы можете повторно использовать потоки после завершения назначенной им задачи для новых задач.

...