Блокировка обратного вызова Python Timer? - PullRequest
0 голосов
/ 02 ноября 2018

При использовании простого многопоточного Timer (), используемого для завершения подпроцесса по истечении времени ожидания, вызов proc.kill напрямую работает, как и ожидалось, но вызов proc.kill с помощью другого обратного вызова - нет. Обратный вызов выполнен, но подпроцесс не убит?

from subprocess import Popen, PIPE
from threading import Timer


def pkill(p):
  pid = p.pid
  print("Killing process pid=[%s]\n" % (pid))
  p.kill


def run(cmd, timeout_sec):
  print("Popen() for cmd=[%s]\n" % (command))
  proc = Popen(shlex.split(cmd), stdout=PIPE, stderr=PIPE)
  pid = proc.pid
  print("Starting subprocess with pid=[%s]\n" % (pid))

  ## works as expected when kill called directly
  timer = Timer(timeout_sec, proc.kill )

  ## doesn't work when given to a callback
  ## timer = Timer(timeout_sec, pkill, [proc] )

  try:
    print("Starting timer() for [%d] seconds\n" % (timeout_sec))
  timer.start()
    stdout, stderr = proc.communicate()
  finally:
    timer.cancel()

run("sleep 5", 1)
...