我有一个从传感器收集数据的python应用。传感器的驱动程序是封闭源代码,我在其周围编写了包装器以简化其使用。整个应用程序在Linux上运行。该程序具有以下流程。
步骤4仅在c ++线程未运行(从未启动或已停止)时发生。如果线程正在运行,并且我正在将其从传感器数据队列中拉出,则会得到“没有活动异常的终止调用”,并且我的应用程序将挂起。提及此消息的其他问题都指出,退出是导致消息退出的原因,但没有加入线程,但我的代码从未进入关机代码中的join语句。
[如果我不得不猜测,似乎在发出SIGINT时驱动程序线程之一或我的c ++线程正在退出,导致主python线程挂起,等待最后一条数据放入队列中(正确现在我以非常低的速率采样传感器)。但是我对此可能完全错了。
SIGINT信号可能会停止其他线程之一吗?如果是这样,我有什么办法可以防止这种情况发生?
谢谢!
我的代码的粗略概述。
主要的Python应用
import driver # this wraps a bunch of ctypes calls
def sigint_handler(sig,frame):
print('handling SIGINT signal')
global isRun
isRun = false
global isRun
isRun = True
signal.signal(SIGINT,sigint_handler)
driver.setupDriver()
while isRun:
data = driver.getData()
logger.log(data)
print('cleaning up')
driver.stopDriver() #this should stop the c++ threads
logger.stop()
我的驱动程序接口层c ++
std::queue<data_t> sensorDataQ()
std::mutex dataq_mutex()
std::thread worker
bool isRun = True;
void workerWork()
{
while(isRun)
{
auto data = getData_sensor_primary_driver();
{
std::lock_guard(dataq_mutex)
sensorDataQ.push(data)
}
}
}
extern "C" data_t getData()
{
while(sensorDataQ.empty())
{
std::this_thread::sleep_for(50) //sleep for 50 miliseconds until we get some data
}
{
std::lock_guard(dataq_mutex)
sensorDataQ.push(data)
}
}
extern "C" startDriver()
{
start_sensor_primary_driver() // this appears to start 4 threads according to GDB
worker = std::thread(workerWork)
worker.start()
}
extern "C" stopDriver()
{
isRun = false;
worker.join()
cleanup_primary_driver()
}