如何突然终止正在进行的处理

时间:2013-08-01 15:55:47

标签: python subprocess

我试图使用子进程调用来调用python函数。我已经看过许多子进程的例子,但没有看到任何调用另一个python函数。我不确定是否可以做到。

我的函数fakeFxn执行一些处理,可能需要几秒钟或几个小时的时间。我想跳过那些花费超过特定时间的话,比如1小时。这个功能也给我一些我需要收集的价值。

def fakeFxn(val):
    if (val== "terminate"):
        for i in range(10):
            z = "t"
        return(z)
    else:
        for i in range(100000000): #Instead of infinite loop, here I am doing some big computation
            y = "nt"
        return(y)


import subprocess
elapsedTime = 0
p = subprocess.Popen(retval = fakeFxn("terminate"))
rc = p.poll()  #returncode
while (rc == None):
    sleep(5)
    elapsedTime = elapsedTime + 5
    if(elapsedTime <10):
        rc = p.poll()
        continue
    else:
        rc = "timeout"
        p.kill()
        break

这是一个很好的方法吗?或者有没有其他方法可以做同样的事情?我在这里问了一个相关的问题:Abruptly stop executing a command and continue to the next one

我的实际功能是这篇文章的``rpart`功能。

2 个答案:

答案 0 :(得分:2)

通过subprocess不确定,但您应该可以在multiprocessing和包装函数的帮助下完成此操作:

import time
from Queue import Empty
from multiprocessing import Process, Queue

def fakeFxn(val):
    if val == 'terminate':
        time.sleep(0.1)
        return 't'
    else:
        time.sleep(1000)
        return 'nt'

def ffWrapper(val, queue):
    retval = fakeFxn(val)
    queue.put(retval)

if __name__ == '__main__':
    q = Queue()
    p = Process(target=ffWrapper, args=('terminate', q))
    p.start()
    rc = ''
    try:
        rc = q.get(timeout=10)
    except Empty:
        print 'timeout'
    p.terminate()
    print rc

答案 1 :(得分:0)

subprocess应该用于执行外部程序,而不是单个模块中的Python函数。

对于您的特定任务,最好使用threadingmultiprocessing模块。您的代码可以像这样重写(两秒后超时):

from multiprocessing import Process
import time


def fake_function(arg):
    time.sleep(arg)
    print arg 


p = Process(target=fake_function, args=(10,))
p.start()
p.join(timeout=2)
p.terminate()