Abaqus/CAE中的Python多处理
我正在使用一个名为Abaqus/CAE1的商业应用程序,它带有内置的python2.6解释器和API。我已经开发了一个长时间运行的脚本,我正在尝试使用Python的Abaqus/CAE中的Python多处理,python,multiprocessing,abaqus,Python,Multiprocessing,Abaqus,我正在使用一个名为Abaqus/CAE1的商业应用程序,它带有内置的python2.6解释器和API。我已经开发了一个长时间运行的脚本,我正在尝试使用Python的多处理模块将其拆分为同时的独立任务。然而,一旦产生了进程,它们就会挂起 脚本本身使用各种对象/方法,这些对象/方法只能通过Abaqus专有的cae模块获得,只有先启动与Abaqus/cae捆绑的Python才能加载,然后再使用Python的execfile执行脚本 为了使多处理工作正常,我尝试运行一个脚本,避免访问任何Abaqus对象
多处理
模块将其拆分为同时的独立任务。然而,一旦产生了进程,它们就会挂起
脚本本身使用各种对象/方法,这些对象/方法只能通过Abaqus专有的cae
模块获得,只有先启动与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
Abaqus随后将启动,自动导入自己的专有模块,然后使用以下命令执行我的文件:
execfile("multi.py", __main__.__dict__)
其中全局名称空间arg\uuuuu main\uuuu.\uuuuu dict\uuuu
由Abaqus设置。Abaqus然后成功签出每个进程的许可证,生成新进程,然后。。。就这样。进程是创建的,但它们都挂起,什么也不做。没有错误消息
什么可能导致挂断,我如何修复它?是否有必须设置的环境变量?是否有其他使用类似程序的商业系统可供我学习/仿效
请注意,任何解决方案都必须在标准库中可用
系统详细信息:Windows 10 64位、Python 2.6、Abaqus/CAE 6.12或6.14
测试脚本示例:
#multi.py
导入多处理
导入时间
def纤维(n):
a、 b=0,1
对于范围(n)中的i:
a、 b=a+b,a
归还
def workerfunc(数量):
fname=''.join('worker_u',str(num),'.txt'))
将open(fname,'w')作为f:
f、 写入('Starting Worker{0}\n'。格式(num))
计数=0
虽然计数<1000:#我必须写一个答案,因为我还不能发表评论
我可以想象的一个原因是,python多处理使用它自己的非共享内存生成了一个全新的进程。因此,如果在脚本中创建一个对象,则启动一个新进程,该新进程包含内存的一个副本,并且您有两个可以进入不同方向的对象。当abaqus的某些内容出现在原始python进程(我怀疑)中时,该进程也会被复制,而此复制可能会创建这样的行为
作为一个解决方案,我认为您可以(能够在一个进程中使用多个内核)并在那里使用线程。只是想说,我遇到了这个确切的问题。目前我的解决方案是划分脚本。如果您试图在给定模型上运行参数扫描,或在同一模型上运行几何变化等,则这可能适用于您
我首先生成脚本以完成建模过程的每个部分:
使用CAE/Python生成输入文件
提取我想要的数据并将其放入文本文件中
创建这些脚本后,我使用文本替换快速生成每种类型的N个python脚本,每个离散参数集对应一个脚本
然后,我用Python编写了一个并行处理工具,将多个Abaqus实例作为子进程调用。这样做的目的如下:
C:\some\path>python multi.py # <-- Using system Python
C:\some\path>abaqus python multi.py # <-- Using Python bundled with Abaqus
通过subprocess.Call为每个模型生成脚本调用CAE。该脚本允许您选择一次运行多少个实例,以避免您获取服务器上的每个许可证
使用相同的方法,对生成的模型执行Abaqus解算器,每个作业的核心参数和使用的核心总数
使用与1相同的过程提取数据
生成模型时,重复检查CAE许可证会带来一些开销,但在我的测试中,能够同时生成10多个输入文件的好处远远超过了这一开销
如果您认为上面概述的过程对您的应用程序有帮助,我可以将一些脚本放到Github上
干杯,
Nathan我确信在执行我的文件之前,Abaqus在CAE内核中做了很多事情。Hmmm.当它调用execfile
时,它会传入大量对象来填充名称空间。有没有可能这是必要的?例如,使用multiprocessing.process(target=…,args=…)
中的args
参数将其复制到每个新进程中?它已被多进程复制。我想这就是你出现问题的原因,因为这些物体可能不会存在多次。啊哈,谢谢,我想我明白了。我会做更多的调查,但听起来这从用户端是无法控制的。如果你真的需要使用多个内核,你可以查看我答案中链接的C API,但这需要更大的努力。如果您只需要并发性,那么还可以在Python.uncontrolable中使用线程,至少在Python方面是这样。正如您所提到的,C扩展可以工作,我的程序的某些部分已经使用了它,因此这似乎是合理的…尽管我从未尝试过编写多线程C程序,这听起来有点可怕。谢谢,您提出在github上安装脚本将是有趣的。然而,不幸的是,我试图实现的目标有些不同——我希望许多“工人”攻击同一个耗时的任务,将其分成若干块,而不是同时运行许多独立的工作。您认为子流程会通过通过abaqus cae noGUI
选项启动的Python实例来处理这个问题吗?我不这么认为,子流程只对在appl之外启动有用
# 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