Abaqus/CAE中的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/CAE1的商业应用程序,它带有内置的python2.6解释器和API。我已经开发了一个长时间运行的脚本,我正在尝试使用Python的
多处理
模块将其拆分为同时的独立任务。然而,一旦产生了进程,它们就会挂起

脚本本身使用各种对象/方法,这些对象/方法只能通过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