2

我正在尝试使用子进程调用来调用 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

这是一个好方法吗?或者有没有其他方法可以做到这一点?我在这里问了一个相关的问题:突然停止执行命令并继续执行下一个命令

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

4

2 回答 2

2

不确定 through 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
于 2013-08-01T17:19:38.410 回答
0

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

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

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()
于 2013-08-01T17:00:09.417 回答