Python 来自 Abaqus/CAE 的多处理
Python multiprocessing from Abaqus/CAE
我正在使用名为 Abaqus/CAE1 的商业应用程序,其中内置了 Python 2.6 解释器和 API。我开发了一个长 运行ning 脚本,我试图使用 Python 的 multiprocessing
模块将其拆分为同时进行的独立任务。但是,一旦生成进程就会挂起。
脚本本身使用了各种只能通过 Abaqus 的专有 cae
模块获得的 objects/methods,只能通过首先启动与 Abaqus/CAE 捆绑的 Python 来加载,然后使用 Python 的 execfile
.
执行我的脚本
为了尝试让多处理工作,我尝试 运行 一个避免访问任何 Abaqus 对象的脚本,而只是执行计算并将结果打印到文件2。这样,我可以 运行 来自常规系统 Python 安装以及来自与 Abaqus 捆绑的 Python 的相同脚本。
当 运行 从命令行使用以下任一命令时,下面的示例代码按预期工作:
C:\some\path>python multi.py # <-- Using system Python
C:\some\path>abaqus python multi.py # <-- Using Python bundled with Abaqus
这会产生新的进程,每个 运行s 函数并按预期将结果写入文件。但是,当使用 Abaqus/CAE Python 环境调用时:
abaqus cae noGUI=multi.py
Abaqus 然后会启动,自动导入它自己的专有模块,然后使用以下命令执行我的文件:
execfile("multi.py", __main__.__dict__)
其中全局命名空间 arg __main__.__dict__
由 Abaqus 设置。然后,Abaqus 会成功检出每个进程的许可证,生成新进程,然后……就是这样。进程已创建,但它们都挂起并且什么也不做。没有错误消息。
可能是什么原因导致挂断,我该如何解决?是否有必须设置的环境变量?是否有其他使用类似程序的商业系统我可以学习from/emulate?
请注意,任何解决方案都必须在 Python 2.6 标准库中可用。
系统详细信息:Windows10 64 位,Python2.6,Abaqus/CAE6.12 或 6.14
示例测试脚本:
# multi.py
import multiprocessing
import time
def fib(n):
a,b = 0,1
for i in range(n):
a, b = a+b, a
return a
def workerfunc(num):
fname = ''.join(('worker_', str(num), '.txt'))
with open(fname, 'w') as f:
f.write('Starting Worker {0}\n'.format(num))
count = 0
while count < 1000: # <-- Repeat a bunch of times.
count += 1
a=fib(20)
line = ''.join((str(a), '\n'))
f.write(line)
f.write('End Worker {0}\n'.format(num))
if __name__ == '__main__':
jobs = []
for i in range(2): # <-- Setting the number of processes manually
p = multiprocessing.Process(target=workerfunc, args=(i,))
jobs.append(p)
print 'starting', p
p.start()
print 'done starting', p
for j in jobs:
print 'joining', j
j.join()
print 'done joining', j
1广为人知的有限元分析包
2脚本是 [=20 的相当标准的 Python 函数的混合体=],示例来自 PyMOTW
我必须写一个答案,因为我还不能发表评论。
我能想象的原因是 python 多处理产生了一个全新的进程,它有自己的非共享内存。因此,如果您在脚本中创建一个对象,启动一个新进程,该新进程包含内存的副本,并且您有两个可以进入不同方向的对象。当原始 python 进程(我怀疑)中存在 abaqus 的某些内容时,它也被复制了,而这个副本可能会产生这样的行为。
作为解决方案,我认为您可以 extend python with C(能够在单个进程中使用多个内核)并在那里使用线程。
只是想说我已经 运行 解决了这个问题。我目前的解决方案是将我的脚本分开。如果您尝试 运行 对给定模型进行参数扫描,或对同一模型进行 运行 几何变化等,这可能对您有用。
我首先生成脚本来完成建模过程的每个部分:
- 使用 CAE/Python 生成输入文件。
- 提取我想要的数据并将其放入文本文件。
创建这些后,我使用文本替换快速生成每种类型的 N python 个脚本,一个对应我感兴趣的每个离散参数集。
然后我在Python写了一个并行处理工具来调用多个Abaqus实例作为子进程。这会执行以下操作:
通过 subprocess.call 为每个模型生成脚本调用 CAE。该脚本允许您选择一次 运行 的实例数量,以防止您获取服务器上的所有许可证。
使用相同的方法为生成的模型执行 Abaqus 求解器,每个作业的核心参数和使用的核心总数。
使用与 1 相同的过程提取数据。
在生成模型时重复检查 CAE 许可证会产生一些开销,但在我的测试中,能够同时生成 10 个以上输入文件的好处远远超过它。
如果您认为上述过程对您的申请有帮助,我可以将一些脚本放在 Github 上。
干杯,
内森
我正在使用名为 Abaqus/CAE1 的商业应用程序,其中内置了 Python 2.6 解释器和 API。我开发了一个长 运行ning 脚本,我试图使用 Python 的 multiprocessing
模块将其拆分为同时进行的独立任务。但是,一旦生成进程就会挂起。
脚本本身使用了各种只能通过 Abaqus 的专有 cae
模块获得的 objects/methods,只能通过首先启动与 Abaqus/CAE 捆绑的 Python 来加载,然后使用 Python 的 execfile
.
为了尝试让多处理工作,我尝试 运行 一个避免访问任何 Abaqus 对象的脚本,而只是执行计算并将结果打印到文件2。这样,我可以 运行 来自常规系统 Python 安装以及来自与 Abaqus 捆绑的 Python 的相同脚本。
当 运行 从命令行使用以下任一命令时,下面的示例代码按预期工作:
C:\some\path>python multi.py # <-- Using system Python
C:\some\path>abaqus python multi.py # <-- Using Python bundled with Abaqus
这会产生新的进程,每个 运行s 函数并按预期将结果写入文件。但是,当使用 Abaqus/CAE Python 环境调用时:
abaqus cae noGUI=multi.py
Abaqus 然后会启动,自动导入它自己的专有模块,然后使用以下命令执行我的文件:
execfile("multi.py", __main__.__dict__)
其中全局命名空间 arg __main__.__dict__
由 Abaqus 设置。然后,Abaqus 会成功检出每个进程的许可证,生成新进程,然后……就是这样。进程已创建,但它们都挂起并且什么也不做。没有错误消息。
可能是什么原因导致挂断,我该如何解决?是否有必须设置的环境变量?是否有其他使用类似程序的商业系统我可以学习from/emulate?
请注意,任何解决方案都必须在 Python 2.6 标准库中可用。
系统详细信息:Windows10 64 位,Python2.6,Abaqus/CAE6.12 或 6.14
示例测试脚本:
# multi.py
import multiprocessing
import time
def fib(n):
a,b = 0,1
for i in range(n):
a, b = a+b, a
return a
def workerfunc(num):
fname = ''.join(('worker_', str(num), '.txt'))
with open(fname, 'w') as f:
f.write('Starting Worker {0}\n'.format(num))
count = 0
while count < 1000: # <-- Repeat a bunch of times.
count += 1
a=fib(20)
line = ''.join((str(a), '\n'))
f.write(line)
f.write('End Worker {0}\n'.format(num))
if __name__ == '__main__':
jobs = []
for i in range(2): # <-- Setting the number of processes manually
p = multiprocessing.Process(target=workerfunc, args=(i,))
jobs.append(p)
print 'starting', p
p.start()
print 'done starting', p
for j in jobs:
print 'joining', j
j.join()
print 'done joining', j
1广为人知的有限元分析包
2脚本是 [=20 的相当标准的 Python 函数的混合体=],示例来自 PyMOTW
我必须写一个答案,因为我还不能发表评论。
我能想象的原因是 python 多处理产生了一个全新的进程,它有自己的非共享内存。因此,如果您在脚本中创建一个对象,启动一个新进程,该新进程包含内存的副本,并且您有两个可以进入不同方向的对象。当原始 python 进程(我怀疑)中存在 abaqus 的某些内容时,它也被复制了,而这个副本可能会产生这样的行为。
作为解决方案,我认为您可以 extend python with C(能够在单个进程中使用多个内核)并在那里使用线程。
只是想说我已经 运行 解决了这个问题。我目前的解决方案是将我的脚本分开。如果您尝试 运行 对给定模型进行参数扫描,或对同一模型进行 运行 几何变化等,这可能对您有用。
我首先生成脚本来完成建模过程的每个部分:
- 使用 CAE/Python 生成输入文件。
- 提取我想要的数据并将其放入文本文件。
创建这些后,我使用文本替换快速生成每种类型的 N python 个脚本,一个对应我感兴趣的每个离散参数集。
然后我在Python写了一个并行处理工具来调用多个Abaqus实例作为子进程。这会执行以下操作:
通过 subprocess.call 为每个模型生成脚本调用 CAE。该脚本允许您选择一次 运行 的实例数量,以防止您获取服务器上的所有许可证。
使用相同的方法为生成的模型执行 Abaqus 求解器,每个作业的核心参数和使用的核心总数。
使用与 1 相同的过程提取数据。
在生成模型时重复检查 CAE 许可证会产生一些开销,但在我的测试中,能够同时生成 10 个以上输入文件的好处远远超过它。
如果您认为上述过程对您的申请有帮助,我可以将一些脚本放在 Github 上。
干杯, 内森