我试图使用子进程调用来调用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`功能。
答案 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函数。
对于您的特定任务,最好使用threading或multiprocessing模块。您的代码可以像这样重写(两秒后超时):
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()