作家
登录

一个Reentrant Error引发的对Python信号机制的探索和思考

作者: 来源: 2017-09-14 11:04:12 阅读 我要评论

  
  •  
  • #ifdef WITH_THREAD  
  •     if (PyThread_get_thread_ident() != main_thread)  
  •         return 0;  
  • #endif   
  •  
  •     is_tripped = 0;   
  •  
  •     if (!(f = (PyObject *)PyEval_GetFrame()))  
  •         f = Py_None;   
  •  
  •     for (i = 1; i < NSIG; i++) { 
  •  
  •         if (Handlers[i].tripped) {  
  •             PyObject *result = NULL 
  •             PyObject *arglist = Py_BuildValue("(iO)", i, f);  
  •             Handlers[i].tripped = 0;   
  •  
  •             if (arglist) {  
  •                 result = PyEval_CallObject(Handlers[i].func, arglist);  
  •                 Py_DECREF(arglist);  
  •             } 
  •  
  •             if (!result)  
  •                 return -1;   
  •  
  •             Py_DECREF(result);  
  •         }  
  •     }   
  •  
  •     return 0;  
  •  
  • 可见,这个函数就是异步回调的最里层,包含了履行 Python Signal Handler 的逻辑。

    至此我们可以发明,全部 Python 中有两个办法可以唤起 Python Signal Handler,一个是调用 checksignals_witharg,另一个是调用 PyErr_CheckSignals。前者只是后者的简单封包。

    checksignals_witharg 在 Python 源码中只出现了一次(不包含定义,下同),没有被直接调用的迹象。但须要留意的是,checksignals_witharg 曾被当做 Py_AddPendingCall 的参数,Py_AddPendingCall 所做的工妆厩?其参加到一个全局队列中。与之对应的出队操作是 Py_MakePendingCalls,位于 Python/ceval.c 的 464 行。此函数会借居调用 checksignals_witharg,在 Python 源码中被调用了 3 次:

    • Modules/_threadmodule.c 52 行的 acquire_timed
    • Modules/main.c 310 行的 run_file
    • Python/ceval.c 722 行的 _PyEval_EvalFrameDefault

    值得留意的是,_PyEval_EvalFrameDefault 是一个长达 2600 多行的状况机,是解析字节码的核心逻辑地点。此处调用出现于状况机主轮回开端处——这印证了膳绫擎答复中的部分辩法,即 Python 会在两个字节铝闼殇唤起 Python Signal Hanlder。

    这很显然与我的法度榜样结不雅相悖:print 与 print 所调用的 io.BufferedWriter.write 和 io.BufferedWriter.flush 都是用纯 C 代码编写的,对其的调用只消费一条字节码(CALL_FUNCTION 或 CALL_FUNCTION_KW),在旌旗灯号中断的影响下,这几个函数仍保持原子性,在时序图上互不重叠,更不会产生重入。


      推荐阅读

      CIO半月刊第十九期|李克强总理再提制造业转型,51CTO带你摸底制造业

    51CTO诚邀您9月23号和秒拍/国美/美团元专家一路聊智能CDN的优化之路,抓紧时光哦! 【编辑推荐】CIO半月刊第十四期|查访过30多位CIO,我们得出如许的结论CIO半月刊第十五期|某有名旅游企业>>>详细阅读


    本文标题:一个Reentrant Error引发的对Python信号机制的探索和思考

    地址:http://www.17bianji.com/lsqh/37408.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)