本篇给出自动先后运行程序(串行)的 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通过定时任务,在指定时间自动运行程序
【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com】