说明
标准调度是python使用软件时钟调度线程,有时python线程会自动堵塞,如raw_input(),sleep()此时python使用阻塞调度等功能。
1、主线程调用slep后,立即释放GIL。
调用操作系统的sleep操作。此时,主线程由操作系统自动管理。
2、GIL获得子线程。操作系统可同时安排主线程和子线程。
操作系统在执行子线程一段时间后悬挂,安排主线程,在主线程slep结束前悬挂主线程,继续唤醒子线程执行。
3、操作系统在主线程结束时唤醒主线程。
Py_主线程调用Py_END_ALLOW_THREADS再次申请GIL,重新进入python标准调度过程。
实例
[ceval.h] #definePy_BEGIN_ALLOW_THREADS{\ PyThreadState*_save;\ _save=PyEval_SaveThread(); #definePy_END_ALLOW_THREADSPyEval_RestoreThread(_save);\ } [ceval.c] PyThreadState*PyEval_SaveThread(void) { PyThreadState*tstate=PyThreadState_Swap(NULL); if(interpreter_lock) PyThread_release_lock(interpreter_lock); returntstate; } voidPyEval_RestoreThread(PyThreadState*tstate) { if(interpreter_lock){ interr=errno; PyThread_acquire_lock(interpreter_lock,1); errno=err; } PyThreadState_Swap(tstate); }
以上是python阻塞调度的使用,希望对大家有所帮助。更多Python学习指导:python基础教程
本文教程操作环境:windows7系统Python 3.9.1,DELL G3电脑。