如何解决超时后,Abaqus API 中的 waitForCompletion(timeout) 实际上并没有终止作业
我正在对一些 Abaqus 模拟进行参数扫描,因此我正在使用 waitForCompletion()
函数来防止脚本过早运行。然而,有时参数组合会导致模拟在扫描中的一个或两个参数上挂起大约半小时到一个小时,而大多数参数组合只需要大约 10 分钟。我不需要所有的数据点,所以我宁愿牺牲一两个结果来支持更多的模拟。因此,我尝试使用 waitForCompletion(timeout)
作为记录的 here。但它不起作用 - 无论我将等待时间设置得有多短,它最终都会像不确定的 waitForCompletion
一样起作用。我正在使用 Abaqus 2017,我想知道是否还有其他人使用过此功能,如果有,如何使用?
虽然我可以使用解决方法,例如添加自定义超时函数并在作业中使用 kill()
函数,但我更愿意使用 Abaqus API 的内置功能,因此非常感谢您的帮助!
解决方法
似乎从某个版本开始,此方法中删除了 timeOut
可选参数:比较 v6.7 和 v6.14 文档中的“脚本参考手册”条目。
您有几个选择:
-
来自 Abaqus API:在模拟过程中检查
my_abaqus_script.023
文件是否仍然存在:
import os,time
timeOut = 600
total_time = 60
time.sleep(60)
# whait untill the the job is completed
while os.path.isfile('my_job_name.023') == True:
if total_time > timeOut:
my_job.kill()
total_time += 60
time.sleep(60)
-
从外部:使用
subprocess
启动作业
注意:不要在命令中使用 interactive
关键字,因为它会在模拟过程处于活动状态时阻止脚本的执行。
import subprocess,os,time
my_cmd = 'abaqus job=my_abaqus_script analysis cpus=1'
proc = subprocess.Popen(
my_cmd,cwd=my_working_dir,stdout='my_study.log',stderr='my_study.err',shell=True
)
- 并检查起诉
poll()
的子进程的返回代码(另见returncode
):
timeOut = 600
total_time = 60
time.sleep(60)
# whait untill the the job is completed
while proc.poll() is None:
if total_time > timeOut:
proc.terminate()
total_time += 60
time.sleep(60)
- 或使用
wait()
等待超时
timeOut = 600
try:
proc.wait(timeOut)
except subprocess.TimeoutExpired:
print('TimeOut reached!')
注意:我知道 terminate()
和 wait()
方法理论上应该有效,但我自己还没有尝试过这个解决方案。所以也许会有一些额外的复杂性(比如使用 psutil.Process(proc.pid)
查找由 Abaqus 创建的所有子进程)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。