其他文章/不再维护

使用Python实现自动先后运行程序

本篇给出自动先后运行程序(串行)的 Python 示例。

串行场景一:如果一个程序依赖于另外一个程序生成的数据,那么代码需要先后运行,但在服务器上,任务提交后是并行计算的,因此需要等待一个任务完成后,再人为地提交另外一个任务,不能同时提交。这里给出任务自动先后提交运行的 Python 示例。

首先给一个错误的提交代码示例:

import os
os.system('qsub task_1.sh')
os.system('qsub task_2.sh')

以上这个示例会直接提交并行计算,并不会产生阻塞。

串行场景二:在本地电脑运行几个程序,除了上面说的有数据依赖的场景外,如果分窗口同时运行,CPU使用率会特别高,同时每个程序的运算速度也会降低。为了不让CPU满负荷运行,兼顾其他的日常任务,那么也可能需要先后运行代码。

以下给出三种串行的方法,推荐前面两种。

一、在第一个任务底部增加代码

一个可行的实现方案是在第一个任务的Python文件底部增加代码。

import os
os.system('qsub task_2.sh')

import os
os.system('python task_2.py')

二、运行单独的文件先后执行任务

Python代码如下:

import os
import time

start = time.time()

print('程序1开始的时间:', time.ctime())
start1 = time.time()
os.chdir('D:') # 代码位置
os.system('python a.py') # 运行a.py
end1 = time.time()
print('程序1运行时间(min)=', (end1-start1)/60,'\n')

print('程序2开始的时间:', time.ctime())
start2 = time.time()
os.chdir('E:') # 代码位置
os.system('python b.py') # 运行b.py
end2 = time.time()
print('程序2运行时间(min)=', (end2-start2)/60, '\n')

end = time.time()
print('总运行时间(min)=', (end-start)/60)

三、额外增加一个后台程序循环做判断

这里通过产生的文件来做判断,从而实现串行提交任务。该方案比较适合在第一个任务已经执行的情况下,是补充串行的方法。

代码示例(run_qsub.py)如下:

import os
import time
# os.system('qsub task_1.sh')
while True:
    if os.path.exists('./complete_1.txt'):
        os.system('qsub task_2.sh')
        break
    time.sleep(180)

import os
import time
# os.system('python task_1.py')
while True:
    if os.path.exists('./complete_1.txt'):
        os.system('python task_2.py')
        break
    time.sleep(180)

前提是在 task_1 的代码在需要产生一个最终文件,例如 complete_1.txt,用于判断程序是否结束,或者数据是否已经产生。这里是 3 分钟检查一次。该代码可以在服务器的主节点上运行,如果任务时间本身就比较长,可以考虑把检查的时间间隔延长,防止大量占用主节点资源,程序被服务器商关闭。

如果需要关闭终端,可使用后台运行的命令:nohup python run_qsub.py &

查看后台运行的进程:ps -ef | grep run_qsub

关闭后台运行的进程:kill PID_num

参考资料:

[1] Python+selenium通过定时任务,在指定时间自动运行程序

[2] python基础之os.system函数

649 次浏览

【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code