python如何在没有__main__的情况下运行多处理派生



我用一些python代码扩展了我的c程序(在c中初始化一个python env,然后从python模块导入一个函数并运行它(,在这种情况下,我不得不调用多处理模块并生成一个没有__main__函数的进程,我知道它在__main__中工作,但是我可以在我的C程序中做点什么,让它可以在__main__之外执行多处理派生吗。

文件x.c

#include <Python.h>
#include <iostream>

using namespace std;
int main()
{
Py_Initialize();
PyObject *module_name = PyUnicode_FromString("t1");
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append("./")");
cout << "Python Version: " << endl << Py_GetVersion() << endl << endl;
PyObject *module = PyImport_Import(module_name);
PyObject *func = PyObject_GetAttrString(module, "run");
PyObject *args = Py_BuildValue("()");
PyObject_CallObject(func, args);
Py_DECREF(args);
Py_DECREF(func);
Py_DECREF(module);
Py_DECREF(module_name);
return 0;
}
  • 生成文件*
all:
g++ -O0 -g3 -std=c++11 x.c $(shell python3-config --includes) $(shell python3-config --ldflags) -o a.out -Wall

文件t1.py

# -*- coding: utf-8 -*-
import multiprocessing as mp

def test():
print("hello world")

def run():
ctx = mp.get_context('spawn')
# ctx = mp.get_context('fork')
p = ctx.Process(target=test, args=())
p.start()
p.join()
# run()

从x.c调用run函数将不打印任何内容,而在t1.py末尾添加run((并直接使用python3 t1.py运行,则会引发"freeze_support"错误。

t2.py

# -*- coding: utf-8 -*-
import multiprocessing as mp

def test():
print("hello world")

def run():
# ctx = mp.get_context('spawn')
ctx = mp.get_context('fork')
p = ctx.Process(target=test, args=())
p.start()
p.join()

如果从x.c 调用run函数,此脚本可以打印hello世界

t3.py

# -*- coding: utf-8 -*-
import multiprocessing as mp

def test():
print("hello world")

def run():
ctx = mp.get_context('spawn')
# ctx = mp.get_context('fork')
p = ctx.Process(target=test, args=())
p.start()
p.join()

if __name__ == "__main__":
run()

这个单独运行的脚本(python3.5 t3.py(也可以运行(最后打印hello world(

我想在c程序中执行没有__main__项的run函数(通过PyObject_CallObject(,那么,我该如何使它工作呢。

在"上下文和启动方法"一节的末尾有以下警告:

警告:'spawn''forkserver'启动方法当前不能与Unix上的"冻结"可执行文件(即由PyInstallercx_Freeze等包生成的二进制文件(一起使用。'fork'启动方法确实有效。

由于multiprocessing从运行已编译(即冻结(可执行文件的当前进程中创建新进程,因此无法使用'spawn'作为启动方法。

但是,您可以继续使用"fork"(正如您在示例中所描述的那样(。

相关内容

  • 没有找到相关文章

最新更新