LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1863|回复: 1

请教一个关于python的全局锁的问题

[复制链接]
发表于 2008-7-24 22:22:15 | 显示全部楼层 |阅读模式
在把python的程序嵌入到c中,使用多线程的时候发现这么一个现象,python中如果把循环到一定长度后,在c线程退出的时候就会出现
Fatal Python error: This thread state must be current when releasing

这个错误,大概就是线程在释放的时候的状态应该是处于主线程状态,而python中循环写得短的话,就不会出问题,只启动一个线程的话也不会有问题,启动两个以上线程并且有一个线程循环很长的话就会有这个问题,希望大家能帮帮我看看要怎么做,最近全局锁把头都整大了,如果直接使用全局锁的话,会对别的非线程程序造成影响,所以使用的是PyGILState_STATE系列.

python的程序样本如下:

def strtest():
        #global mystr
        a=0
       
        while a<1000000:
                a=a+1
       
        print 'ok'
               
        return 0



c的线程样本如下:

void ThreadProc1(void*p){



        PyObject *  pFunc =NULL;
        PyObject * pValue = NULL;
       

       
       

        PyGILState_STATE gstate;
       
        gstate = PyGILState_Ensure();
       

       

        pFunc = PyDict_GetItemString(pDict,"strtest");
        if (PyCallable_Check(pFunc)){
                pValue = PyObject_CallObject(pFunc, NULL);
        }else{
                PyErr_Print();
        }
       
        Py_CLEAR(pValue);

       

        PyGILState_Release(gstate);

       
        pthread_exit(NULL);


}
发表于 2008-7-25 19:37:16 | 显示全部楼层
嵌入时的 GIL 问题是 Python 一直很头疼的问题。

你可以看看 Lua vs Python 那个Wiki里面非常踊跃的许多帖子。

正因为如此,一般都推荐使用 Python +c模块,而不推荐从C里面嵌入Python。

如果楼主的项目在早期阶段的话,不妨考虑从 C中嵌入 Lua,或者改成程序由 Python 中嵌入 C。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表