Python脚本在SIGINT“以下情况下在没有活动异常的情况下终止调用后挂起”

问题描述 投票:0回答:1

我有一个从传感器收集数据的python应用。传感器的驱动程序是封闭源代码,我在其周围编写了包装器以简化其使用。整个应用程序在Linux上运行。该程序具有以下流程。

  1. Python调用驱动程序设置。这将启动一个由我控制的std :: thread,该线程将轮询传感器并将结果数据放入std :: queue。它还会调用封闭源驱动程序启动代码,该代码似乎启动了两个线程。
  2. Python主线程开始通过调用C ++驱动程序(driver.getData)循环从传感器的数据队列中挑选事物。一旦有了数据,它将进行一些缓冲,并且在汇总了固定数量的样本之后,会将它们写入文件。
  3. 最终,我希望程序停止运行,所以我按ctrl + c发送进程SIGINT。我有一个通过python signal.signal函数注册的处理程序,该函数捕获信号会更改布尔值并返回。我知道处理程序会执行,因为我在处理程序的开头有一条打印语句。
  4. 此时,我希望主python线程停止在其while循环上循环(因为处理程序现在将其检查的条件设置为False)并运行我的清理代码。

步骤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()
}
python c++ multithreading signals ctypes
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.