说明
标准调度是python使用软件时钟调度线程,有时python的线程会自动阻塞,例如raw_input(),sleep()等功能,此时python使用阻塞调度。
1、主线程调用sleep后,立即释放GIL。
调用操作系统的sleep操作。此时,主线程由操作系统自动管理。
2、子线程获得GIL。主线程和子线程可以同时由操作系统安排。
操作系统在执行子线程一段时间后悬挂,安排主线程,在主线程sleep结束前悬挂主线程,继续唤醒子线程执行。
3、当主线程结束时,操作系统唤醒主线程。
主线程调用Py_END_ALLOW_THREADS再次申请GIL,重新进入python标准调度过程。
实例
[ceval.h] #define Py_BEGIN_ALLOW_THREADS { \ PyThreadState *_save; \ _save = PyEval_SaveThread(); #define Py_END_ALLOW_THREADS PyEval_RestoreThread(_save); \ } [ceval.c] PyThreadState* PyEval_SaveThread(void) { PyThreadState *tstate = PyThreadState_Swap(NULL); if (interpreter_lock) PyThread_release_lock(interpreter_lock); return tstate; } void PyEval_RestoreThread(PyThreadState *tstate) { if (interpreter_lock) { int err = errno; PyThread_acquire_lock(interpreter_lock, 1); errno = err; } PyThreadState_Swap(tstate); }
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试