为什么我在使用OpenMP的共享库中的函数在通过swig从子进程调用时挂起?

2024-09-28 18:48:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图包装一个最小的C库,由一个包含

#ifndef LOCKS_H
#define LOCKS_H
void f(void);
#endif

和“locks.c”包含

#include <stdio.h>

void f(void) {
#pragma omp parallel
  {
    fprintf(stderr, "Hello World!\n");
  }
  return;
}

对于swig,使用包含

%module locks

%{
#define SWIG_FILE_WITH_INIT
#include "locks.h"
%}

void f(void);

然后我使用

swig -python locks.i
gcc -fPIC -shared -I/usr/include/python3.6/ -fopenmp locks.c locks_wrap.c -g -o _locks.so

一个快速的测试

python3 -c "import locks; locks.f()"

似乎和预期的一样。你知道吗

但是,当我调用函数f两次时,一次从python主进程调用,一次从如下子进程调用:

from multiprocessing import Process

import locks

locks.f()

print('Launching Process')
p = Process(target=locks.f)
p.start()
p.join()
print(p.exitcode)

代码挂起在子进程的调用中,仅打印

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Launching Process
Hello World!

在Python3.6和

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Launching Process

在Python3.8中,使用4核8超线程的Intel CPU。你知道吗

如果我只从子进程调用函数,而不是在两个进程中调用,那么子进程中的调用也会如预期的那样成功。你知道吗

目标系统是64位Linux(本例中为Ubuntu 18.04)。你知道吗

我怎样才能解决这个问题?你知道吗


Tags: importhelloworldinclude进程processswigprint
1条回答
网友
1楼 · 发布于 2024-09-28 18:48:28

正如Zulan在评论中指出的,核心问题似乎是one cannot call OpenMP functions after a ^{}。你知道吗

幸运的是,Python多处理允许您使用^{}函数请求它,而不是分叉,它从零开始生成全新的解释器进程。你知道吗

所以通过调整python脚本

import multiprocessing as mp

import locks

if __name__ == '__main__':
    mp.set_start_method('spawn')

    locks.f()

    print('Launching Process')
    p = mp.Process(target=locks.f)
    p.start()
    p.join()
    print(p.exitcode)

问题解决了。你知道吗

相关问题 更多 >