Cython进阶--用Cython封装Callback函数

本文详细介绍了如何使用Cython在Python中封装C语言的回调函数,特别是针对多线程库pthread的pthread_create和pthread_join函数。通过PyEval_InitThreads、PyGILState_Ensure、PyGILState_Release、PyEval_SaveThread和PyEval_RestoreThread等Python库函数,确保在多线程环境中正确管理全局解释器锁(GIL)。文章还讨论了GIL的存在原因及其对Python性能的影响,并给出了实际的Cython代码示例和运行结果。
摘要由CSDN通过智能技术生成

Cython封装Callback函数

1 说明:

回调函数,在C语言里是经常要用到的,但是,在Python里封装一个C的回调函数并没有想象的那么简单,本文讲解如何用Cython快速的封装C里的回调函数

 

 

2 不多说,先上代码:

cdef extern from "pthread.h":

    ctypedef void * pthread_t

    ctypedef structpthread_attr_t:

        pass

    int pthread_create (pthread_t*__newthread, \

                  pthread_attr_t *__attr, \

                  void *(*__start_routine) (void *) except*, \

                  void *__arg)

    int pthread_join (pthread_t__th, void **__thread_return)

cdef extern from "Python.h":

    ctypedef enum PyGILState_STATE:

        pass

    ctypedef enum PyThreadState:

        pass

    PyGILState_STATE PyGILState_Ensure()

    void PyGILState_Release(PyGILState_STATE)

    PyThreadState *PyEval_SaveThread()

    void PyEval_RestoreThread(PyThreadState *)

    void PyEval_InitThreads()

    void Py_INCREF(object obj)

    void Py_DECREF(object obj)

def Callback(obj):

    if hasattr(obj,'run'):

       obj.run()

cdef void * start (void * param) except*:

    cdef PyGILState_STATE state

    cdef object obj = param

    cdef void *ret

    if not param:

        return 
    
    
     
     0

    state = PyGILState_Ensure()

    Callback(obj)

    Py_DECREF(obj)

    PyGILState_Release(state)

    return 
     
     
      
      1

def CreateThread(obj):

    cdef int ret

    cdef pthread_t tid

    PyEval_InitThreads()

    Py_INCREF(obj)

    r
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值