环境:VS 2012编写C扩展,python 2.7脚本调用库中的函数
功能:遍历分析100万条记录,找出符合条件的记录。以前使用纯python脚本,因为性能跟不上,多核的CPU无法有效利用,所以想尝试通过python脚本控制多线程,每个线程分一批数据分析,最后汇总结果。接口的参数有:rcd_list(传入的记录列表,每个线程10万条),result_dic(用于存放满足条件的记录)。
问题:采用多线程后,发现在循环里调用PyList_New或者类似的PyTuple_New累计到一定的次数(250,245次)后,pRcd = PyList_New(2);就core掉,抛异常。去掉多线程的声明Py_BEGIN_ALLOW_THREADS宏,就不存在此问题,查找多个文档,没有找到正解,期望大虾给些 意见啊。
代码结构:
PyObject* wrap_test(PyObject* self, PyObject* args)
{
Py_BEGIN_ALLOW_THREADS
PyObject * lstTemp = PyList_New(1);
for (int i =0;i < 100000; i++)
{
printf("index:%d\n ",i );
PyObject *pRcd = NULL;
pRcd = PyList_New(2);//运行到一定次数后,core在这句,对象没有构建成功
PyList_Append(lstTemp,pRcd);
Py_DECREF(pRcd);
}
Py_END_ALLOW_THREADS
}