繁体   English   中英

来自Abaqus / CAE的Python多处理

[英]Python multiprocessing from Abaqus/CAE

我正在使用一个名为Abaqus / CAE 1的商业应用程序,内置Python 2.6解释器和API。 我已经开发了一个长期运行的脚本,我试图使用Python的multiprocessing模块分成同时独立的任务。 然而,一旦产生过程就会挂起。

该脚本本身仅使用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 / CAE Python环境调用时使用:

abaqus cae noGUI=multi.py

然后Abaqus将启动,自动导入自己的专有模块,然后使用以下命令执行我的文件:

execfile("multi.py", __main__.__dict__)

全局命名空间arg __main__.__dict__由Abaqus设置。 然后,Abaqus成功检查每个流程的许可证,生成新流程,......就是这样。 这些进程已创建,但它们都挂起并且什么都不做。 没有错误消息。

什么可能导致挂断,我该如何解决? 是否有必须设置的环境变量? 是否有其他商业系统使用类似的程序,我可以从中学习/模仿?

请注意,任何解决方案都必须在Python 2.6标准库中提供。

系统详细信息:Windows 10 64位,Python 2.6,Abaqus / CAE 6.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该脚本是用于fib()的相当标准的Python函数和来自PyMOTW的示例的混合

我必须写一个答案,因为我还不能发表评论。

我可以想象的一个原因是python多处理使用它自己的非共享内存产生了一个全新的进程。 因此,如果您在脚本中创建一个对象,则启动一个新进程,该新进程包含一个内存副本,并且您有两个可以进入不同方向的对象。 当原始python进程中存在一些abaqus(我怀疑)时,它也会被复制,这个副本可能会产生这种行为。

作为一种解决方案,我认为您可以使用C扩展python (它可以在单个进程中使用多个核心)并在那里使用线程。

只是想说我遇到了这个问题。 我目前的解决方案是划分我的脚本。 如果您尝试在给定模型上运行参数扫描,或在同一模型上运行几何变化等,这可能对您有用。

我首先生成脚本来完成我的建模过程的每个部分:

  1. 使用CAE / Python生成输入文件。
  2. 提取我想要的数据并将其放入文本文件中。

通过这些创建,我使用文本替换来快速生成每种类型的N个python脚本,每个我感兴趣的离散参数集一个。

然后我在Python中编写了一个并行处理工具,将多个Abaqus实例作为子进程调用。 这样做如下:

  1. 通过subprocess.call为每个模型生成脚本调用CAE。 该脚本允许您选择一次运行多少个实例,以防止您在服务器上获取每个许可证。

  2. 使用相同的生成模型执行Abaqus解算器,每个作业的核心参数和使用的核心总数。

  3. 使用与1相同的过程提取数据。

在生成模型时反复检查CAE的许可证会有一些开销,但在我的测试中,能够同时生成10个以上输入文件的好处远远超过它。

如果您认为上面概述的过程对您的应用程序有帮助,我可以将一些脚本放在Github上。

干杯,内森

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM