gpt4 book ai didi

来自 Abaqus/CAE 的 Python 多处理

转载 作者:行者123 更新时间:2023-11-28 19:08:13 26 4
gpt4 key购买 nike

我正在使用名为 Abaqus/CAE1 的商业应用程序,它带有内置的 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 会成功 check out 每个进程的许可证,生成新进程,然后……就是这样。进程已创建,但它们都挂起并且什么也不做。没有错误消息。

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

请注意,任何解决方案都必须在 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 的某些内容时,它也被复制了,而这个副本可能会产生这样的行为。

作为解决方案,我认为您可以 extend python with C (能够在单个进程中使用多个内核)并在那里使用线程。

关于来自 Abaqus/CAE 的 Python 多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44146116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com