在 Python 个扩展中启动线程
Starting threads within Python extensions
我试图从我的 SWIG Python C++ 扩展中启动一个线程,但是,当我转到 运行 时,它会产生以下内容:
libc++abi.dylib: terminating
Abort trap: 6
我猜 GIL 应该没有任何问题,因为没有使用 python 分配的对象。还是我的假设错了?
一个最小的例子:
// _MyExtension.cpp
#include <iostream>
#include <thread>
void threadFunc() {
std::cout << "Thread started" << std::endl;
std::this_thread::sleep_for (std::chrono::seconds(10));
std::cout << "Thread ended" << std::endl;
}
void start() {
std::thread first (threadFunc);
}
// _MyExtension.i
%module _MyExtension
%{
extern void start();
%}
extern void start();
// test.py
import _PyMapper
_PyMapper.start()
简单修复,线程在创建后必须分离,如下所示:
void start() {
std::thread first (threadFunc);
first.detach();
}
然后,它工作正常!但是,一旦原始 Python 脚本中的所有语句都已完成,线程将过早终止。通过向重新加入线程的扩展添加函数调用可以解决此问题。
我试图从我的 SWIG Python C++ 扩展中启动一个线程,但是,当我转到 运行 时,它会产生以下内容:
libc++abi.dylib: terminating
Abort trap: 6
我猜 GIL 应该没有任何问题,因为没有使用 python 分配的对象。还是我的假设错了?
一个最小的例子:
// _MyExtension.cpp
#include <iostream>
#include <thread>
void threadFunc() {
std::cout << "Thread started" << std::endl;
std::this_thread::sleep_for (std::chrono::seconds(10));
std::cout << "Thread ended" << std::endl;
}
void start() {
std::thread first (threadFunc);
}
// _MyExtension.i
%module _MyExtension
%{
extern void start();
%}
extern void start();
// test.py
import _PyMapper
_PyMapper.start()
简单修复,线程在创建后必须分离,如下所示:
void start() {
std::thread first (threadFunc);
first.detach();
}
然后,它工作正常!但是,一旦原始 Python 脚本中的所有语句都已完成,线程将过早终止。通过向重新加入线程的扩展添加函数调用可以解决此问题。