时间:2021-07-01 10:21:17 帮助过:19人阅读
Python中由于全局锁(GIL)的存在导致多线程并不能利用多核,看了一些资料说,Java好像对多线程的处理是可以利用多核的硬件资源的(因为 Java直接调用的操作系统的多线程接口处理的)。不同的语言对多线程的处理是否能做到利用硬件,主要取决于编译器或者解释器对线程的包装吗?
void
PyEval_AcquireLock(void)
{
PyThread_acquire_lock(interpreter_lock, 1);
}
void
PyEval_ReleaseLock(void)
{
PyThread_release_lock(interpreter_lock);
}
void
PyEval_AcquireThread(PyThreadState *tstate)
{
if (tstate == NULL)
Py_FatalError("PyEval_AcquireThread: NULL new thread state");
/* Check someone has called PyEval_InitThreads() to create the lock */
assert(interpreter_lock);
PyThread_acquire_lock(interpreter_lock, 1);
if (PyThreadState_Swap(tstate) != NULL)
Py_FatalError(
"PyEval_AcquireThread: non-NULL old thread state");
}
void
PyEval_ReleaseThread(PyThreadState *tstate)
{
if (tstate == NULL)
Py_FatalError("PyEval_ReleaseThread: NULL thread state");
if (PyThreadState_Swap(NULL) != tstate)
Py_FatalError("PyEval_ReleaseThread: wrong thread state");
PyThread_release_lock(interpreter_lock);
}
GIL这个东西,跟实现有关。java的每一个对象都继承了object类的六个方法,其中包括wait和notify.如果cpython也这么干,就没gil了。实际上,鸟叔曾搞出过这样的python版本,但是由于单线程性能急剧下降,大家不乐意又换成Gil版本了。
多线程难道不是等io用么→_→