我试图包装一个最小的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)。你知道吗
我怎样才能解决这个问题?你知道吗
正如Zulan在评论中指出的,核心问题似乎是one cannot call OpenMP functions after a ^{} 。你知道吗
幸运的是,Python多处理允许您使用^{} 函数请求它,而不是分叉,它从零开始生成全新的解释器进程。你知道吗
所以通过调整python脚本
问题解决了。你知道吗
相关问题 更多 >
编程相关推荐