在Python扩展中启动线程

Starting threads within Python extensions

本文关键字:启动 线程 扩展 Python      更新时间:2023-10-16

我试图从我的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脚本中的所有语句完成,线程将过早终止。这可以通过在扩展中添加一个重新加入线程的函数调用来修复。