执行相同的过程N次,如果在X秒内没有完成,则终止它

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了执行相同的过程N次,如果在X秒内没有完成,则终止它相关的知识,希望对你有一定的参考价值。

我有一个外部进程,需要一些随机时间来运行,最后它会在标准输出中打印一些输出。

我需要编写一个python进程,运行这样的外部进程N次;在X秒之后,对于已经终止的每个进程,它必须收集输出,并且对于尚未终止的每个进程,它必须将其终止。

你会怎么做?

答案

您可以使用内置API:

http://strftime.org/ https://docs.python.org/3.5/library/time.html

start_time = time.time()
# your code
elapsed_time = time.time() - start_time
time.strftime("%H:%M:%S", time.gmtime(elapsed_time))
#'00:00:02'

要杀死这个过程,我不知道你是如何处理的:

您可以使用:

import subprocess, signal 
p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
out, err = p.communicate()
for line in out.splitlines():
   if 'iChat' in line:
   pid = int(line.split(None, 1)[0])
   os.kill(pid, signal.SIGKILL) # -9 (equivalent.)
另一答案

您可以使用apscheduler模块。一个(快速和肮脏)的例子:

from apscheduler.schedulers.background import BlockingScheduler

count = 0
N = 10 # Change this per your requirement

def run_external_process():
    global count, scheduler

    # Execute the job N times
    count = count + 1

    if count == 10: # Shutdown the scheduler and exit
        scheduler.shutdown(wait=False)
        sys.exit(1)

    #Run your code here

# When each job is executed check for its output 
def listen_for_output():
   if event.retval: # Check the return value of your external process
       # Collect output
   else:
       # Call script to terminate process

try:
    scheduler = BlockingScheduler() # Initiate your scheduler
except ImportError:
    raise ImportError('Failed to import module')
sys.exit(1)  

scheduler.add_job(run_external_process, 'interval', seconds=1, id='my_job_id')
# Add a listener to check the output of your external process
scheduler.add_listener(listen_for_output, EVENT_JOB_EXECUTED|EVENT_JOB_ERROR) 
scheduler.start()           

以上是关于执行相同的过程N次,如果在X秒内没有完成,则终止它的主要内容,如果未能解决你的问题,请参考以下文章

如何每 X 秒创建一次线程,但前提是之前的迭代线程在 C++11 中完成?

JavaScript:函数防抖与节流

算法第二章上机时间报告

四次挥手

我怎样才能等到 Qt 的 keyevents 中的每个进程完成?

防抖与节流