Threading.Timer, чтобы убить долго выполняющуюся задачу с базовым контролем очистки - PullRequest
0 голосов
/ 22 мая 2018

Я бы хотел отслеживать процесс и автоматически убивать его, если он выполняется дольше, чем N секунд.

Я редактирую этот вопрос в ответ на предположение, что это дубликат: Есть ли способ убить поток в Python?

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

В качестве простого теста,Я пытаюсь следующее, чтобы попытаться завершить процесс через 2 секунды:

import threading
import sys
import time

def after_timeout():
  print "KILL THE WORLD HERE!"
  # whats the secret sauce here (if any)?
  # sys.exit() and other variants aren't
  # killing the main thread... is it possible?

threading.Timer(2, after_timeout).start()

i = 0
while True:
  print i
  i += 1
  time.sleep(1)

1 Ответ

0 голосов
/ 22 мая 2018

Итак ... я думаю, что, возможно, удалось решить эту проблему путем объединения 10 различных сообщений SO таким образом, которого я не видел ни в одном сообщении SO ..., пожалуйста, критикуйте и скажите мне, глупо это или блестяще ...; -)

[Поскольку этот вопрос очень тесно связан, по крайней мере, с двумя другими ... Я предложил свое решение в качестве независимого ответа в обеих связанных темах: 1 2 ]

import threading
import time
import atexit

def do_work():

  i = 0
  @atexit.register
  def goodbye():
    print ("'CLEANLY' kill sub-thread with value: %s [THREAD: %s]" %
           (i, threading.currentThread().ident))

  while True:
    print i
    i += 1
    time.sleep(1)

t = threading.Thread(target=do_work)
t.daemon = True
t.start()

def after_timeout():
  print "KILL MAIN THREAD: %s" % threading.currentThread().ident
  raise SystemExit

threading.Timer(2, after_timeout).start()

Выход:

0
1
KILL MAIN THREAD: 140013208254208
'CLEANLY' kill sub-thread with value: 2 [THREAD: 140013674317568]

Я думаю, что это секретный соус, который подойдет для моего приложения.Мой подпоток теперь корректно очищается после определенного промежутка времени без всякой бессмысленной проверки флага цикла внутри упомянутого подпотока ... И я, кажется, даже получаю небольшой проблеск контроля в подпотоке, где я могу сделать какое-то окончательное состояниепроверка и очистка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...