我正在linux上用Python3.4创建一个带有web前端的自定义作业调度程序。此程序创建一个守护进程(使用者)线程,等待作业在PriorityQueue中可用。这些作业可以通过将它们添加到队列的web界面手动添加。当使用者线程找到一个作业时,它使用子流程运行,并等待它完成。你知道吗
辅助线程的基本思想:
class Worker(threading.Thread):
def __init__(self, queue):
self.queue = queue
# more code here
def run(self):
while True:
try:
job = self.queue.get()
#do some work
proc = subprocess.run("myprogram", timeout=my_timeout)
#do some more things
except TimeoutExpired:
#do some administration
self.queue.add(job)
但是:
我应该使用什么样的同步原语来中断这个线程,或者确保它以阻塞的方式同时等待几个事件?你知道吗
我认为您无意中忽略了一个简单的解决方案:您的第二个要点是,您有能力杀死正在子进程中运行的程序。注意
subprocess.call
returns the return code of the subprocess。这意味着您可以让主线程终止子进程,只需检查返回代码,看看是否需要进行任何清理。更好的是,您可以改用subprocess.check_call,如果returncode不是0,它将为您引发一个异常。我不知道您使用的是什么平台,但是在Linux上,如果进程被终止,终止进程通常不会返回0。你知道吗它可能看起来像这样:
注意,如果您使用的是python3.5,那么可以改用subprocess.run,并将
check
参数设置为True
。你知道吗如果您非常需要处理当worker没有运行子进程时需要中断的情况,那么我认为您将不得不使用轮询循环,因为我认为Python中的线程不支持您正在寻找的行为。您可以使用threading.Event对象将“立即停止工作”伪信号从主线程传递给工作线程,并让工作线程定期检查该事件对象的状态。你知道吗
如果您愿意考虑使用多个处理而不是线程,那么可以考虑切换到multiprocessing module,这将允许您处理信号。生成完整的子进程而不是线程会有更多的开销,但是您实际上是在寻找类似信号的异步行为,我认为Python的线程库不支持这样的行为。不过,一个好处是您可以从Global Interpreter Lock(PDF链接)中解放出来,因此如果您的工作进程(以前称为线程)正在做任何CPU密集型的事情,您实际上可能会看到一些速度方面的好处。你知道吗
相关问题 更多 >
编程相关推荐