Подтвердить что ты не робот

Остановка потока через определенное время

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

def main():
    t1 = threading.Thread(target=thread1, args=1)
    t2 = threading.Thread(target=thread2, args=2)

    time.sleep(duration)
    #the threads must be terminated after this sleep
4b9b3361

Ответ 1

Это будет работать , если вы не блокируете.

Если вы планируете делать сон, абсолютно необходимо, чтобы вы использовали это мероприятие для сна. Если вы используете событие для сна, если кто-то говорит вам остановиться, пока он "спит", он проснется. Если вы используете time.sleep(), ваш поток будет остановлен только после его просыпания.

def main():
  t1_stop= threading.Event()
  t1 = threading.Thread(target=thread1, args=(1, t1_stop))

  t2_stop = threading.Event()
  t2 = threading.Thread(target=thread2,  args=(2, t2_stop))

  time.sleep(duration)
  #stop the thread2
  t2_stop.set()

def thread1(arg1, stop_event):
  while(not stop_event.is_set()):
      #similar to time.sleep()
      stop_event.wait(time)
      pass


def thread2(arg1, stop_event):
  while(not stop_event.is_set()):
      stop_event.wait(time)
      pass

Ответ 2

Если вы хотите, чтобы потоки остановились, когда ваша программа выйдет (как это подразумевается в вашем примере), создайте им темы демона.

Если вы хотите, чтобы ваши потоки умирали по команде, вам нужно сделать это вручную. Существуют различные методы, но все они связаны с проверкой в ​​вашем потоковом цикле, чтобы проверить, не осталось ли времени для выхода (см. Пример Nix).