python限制子进程运行时间

想在python中限制子进程的运行时间,于是想到了定时器。下面是两种实现方法,具体的进程执行时间

可以调整。先看代码

#!/usr/bin/python

# limit time of subprocess running by set a timer

import os
import time
import signal
import threading

class Timer(threading.Thread):
	"""
	very simple but useless timer.
	"""
	def __init__(self, seconds):
		self.runTime = seconds
		self.process = []
		threading.Thread.__init__(self)
	def run(self):
		time.sleep(self.runTime)
		print "Time's up!"
		for pid in self.process:
			print "now kill process %d"%pid
			os.kill(pid,signal.SIGKILL)


def child():
	while True:
		print ("Child process",os.getpid())
		time.sleep(1)

if __name__ == '__main__':
	test = Timer(2)
	test.start()

	for i in range(5):
		newpid = os.fork()
		if newpid == 0:
			child()
		else:
			test.process.append(newpid)
			print ("Parent process ",os.getpid(),newpid)


上面定义了一个定时器的类,并且定时器是一个单独的进程,可以理解为专门用于监视由父进程产生的

子进程,时间一到就算把子进程全部清除。下面可以看看第二种方案:

#!/usr/bin/python

import os
import time
import signal
import threading

process = []

def KillSubProcess(signum,_):
	global process
	for pid in process:
		print "now kill process %d"%pid
		os.kill(pid,signal.SIGKILL)

def child():
	while True:
		print ("Child process",os.getpid())
		time.sleep(1)

if __name__ == '__main__':
	signal.signal(signal.SIGALRM, KillSubProcess)
	signal.alarm(5)
	for i in range(10):
		newpid  = os.fork()
		if newpid == 0:
			child()
		else:
			process.append(newpid)
			print ("Parent process ",os.getpid(),newpid)
	time.sleep(20)
	signal.alarm(0)
	print "Main process exit"

这种方案主要是利用linux信号来实现,在前面一篇文章介绍了sleep对于信号的处理,所以要小心这点。

这种方案和上面的方案不同,定时器在这里是父进程里面的,父进程在子进程执行完成之前不能退出,

可以sleep足够长的时间。为什么不用 os.wait() 呢?我之前用 os.wait() 的时候一直都报错,后来大概

知道可能 os.wait() 和 time.sleep()有着类似的功能,一旦有信号出现 os.wait() 就尝试返回,结果反向子

进程还没有执行完成的,所以就报错了。

标签:Linux, Python

评论已关闭