可见,这个函数就是异步回调的最里层,包含了履行 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
1/2 1

网友点评
精彩导读
科技快报
品牌展示