Skip to content

Instantly share code, notes, and snippets.

@cloverrose
Created October 30, 2013 07:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cloverrose/7228386 to your computer and use it in GitHub Desktop.
Save cloverrose/7228386 to your computer and use it in GitHub Desktop.
subprocessで実行した子プロセスを孫プロセス含めてタイムアウトしたらkillする。UNIX系でのみ動く
# -*- coding:utf-8 -*-
import sys
import os
import subprocess
def fib(n):
pid = os.getpid()
pgrp = os.getpgrp()
sys.stderr.write('[pgrp: {0}, pid: {1}] start calc fib({2})\n'.format(pgrp, pid, n))
if n == 0:
ret = 0
elif n == 1:
ret = 1
else:
p = subprocess.Popen(['python', 'fibonacci.py', str(n-2)], stdout=subprocess.PIPE)
q = subprocess.Popen(['python', 'fibonacci.py', str(n-1)], stdout=subprocess.PIPE)
p_ret, _ = p.communicate()
q_ret, _ = q.communicate()
ret = int(p_ret) + int(q_ret)
sys.stderr.write('[pgrp: {0}, pid: {1}] fib({2}) = {3}\n'.format(pgrp, pid, n, ret))
sys.stdout.write('{0}'.format(ret))
return ret
if __name__ == '__main__':
n = int(sys.argv[1])
fib(n)
# -*- coding:utf-8 -*-
import subprocess
import os
import signal
import sys
class Alarm(Exception):
pass
def alarm_handler(signum, frame):
raise Alarm
def start(cmd, timeout):
try:
signal.signal(signal.SIGALRM, alarm_handler)
signal.alarm(timeout)
p = subprocess.Popen(cmd, preexec_fn=os.setsid, stderr=subprocess.STDOUT)
p.wait()
signal.alarm(0)
except Alarm:
os.killpg(p.pid, signal.SIGTERM)
sys.stderr.write('\ntimeout\n')
else:
sys.stderr.write('\nfinish\n')
if __name__ == '__main__':
"""
demo
"""
start(['python', 'fibonacci.py', '11'], 3)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment