gpt4 book ai didi

c - n 秒后终止 python 中的函数调用

转载 作者:太空宇宙 更新时间:2023-11-04 10:58:14 24 4
gpt4 key购买 nike

我的 python 代码是这样的:

def a():
...
...
subprocess.call()
...
...

def b():
...
...

等等。

我的任务:
1) 如果 subprocess.call() 在 3 秒内返回,我的执行应该在 subprocess.call() 返回时继续。
2) 如果 subprocess.call() 没有在 3 秒内返回,则 subprocess.call() 应该终止,我的执行应该在 3 秒后继续。
3) 在 subprocess.call() 返回或 3 秒完成之前,不应继续执行。

这可以用线程来完成,但是怎么做呢?

真实代码的相关部分是这样的:

...  
cmd = ["gcc", "-O2", srcname, "-o", execname];
p = subprocess.Popen(cmd,stderr=errfile)//compiling C program
...
...
inputfile=open(input,'w')
inputfile.write(scanf_elements)
inputfile.close()
inputfile=open(input,'r')
tempfile=open(temp,'w')
subprocess.call(["./"+execname,str(commandline_argument)],stdin=inputfile,stdout=tempfile); //executing C program
tempfile.close()
inputfile.close()
...
...

我正在尝试使用 python 编译和执行 C 程序。当我使用 subprocess.call() 执行 C 程序时,假设 C 程序包含无限循环,那么 subprocess.call() 应该在 3 秒后终止,程序应该继续。我应该能够知道 subprocess.call() 是被强制终止还是成功执行,以便我可以相应地在以下代码中打印消息。

后端gcc是linux的。

最佳答案

My task:
1) If subprocess.call() returns within 3 seconds, my execution should continue the moment subprocess.call() returns.
2) If subprocess.call() does not return within 3 seconds, the subprocess.call() should be terminated and my execution should continue after 3 seconds.
3) Until subprocess.call() returns or 3 seconds finishes, the further execution should not take place.

在 *nix 上,你可以使用 signal.alarm()-based solution :

import signal
import subprocess

class Alarm(Exception):
pass

def alarm_handler(signum, frame):
raise Alarm

# start process
process = subprocess.Popen(*your_subprocess_call_args)

# set signal handler
signal.signal(signal.SIGALRM, alarm_handler)
signal.alarm(3) # produce SIGALRM in 3 seconds

try:
process.wait() # wait for the process to finish
signal.alarm(0) # cancel alarm
except Alarm: # subprocess does not return within 3 seconds
process.terminate() # terminate subprocess
process.wait()

这是一个基于 threading.Timer() 的可移植解决方案:

import subprocess
import threading

# start process
process = subprocess.Popen(*your_subprocess_call_args)

# terminate process in 3 seconds
def terminate():
if process.poll() is None:
try:
process.terminate()
except EnvironmentError:
pass # ignore

timer = threading.Timer(3, terminate)
timer.start()
process.wait()
timer.cancel()

关于c - n 秒后终止 python 中的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28007496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com