认证高级PHP讲师
这个比较容易理解,GIL保证python byte code在进程内同时只有一个native thread在运行。但byte code自身的逻辑仍然需要加锁/互斥等保证线程可重入,因为byte code运行过程中任意点都可能被打断并切换到另外的线程。
举个简单的例子:一段计数器的代码:// Step 1counter = get_counter()// Step 2counter += 1// Step 3set_counter(counter)
假设初始Counter为0,在不做任何同步的情况下两个线程同时执行这段Python代码,期望结果应该是两个线程都做了计数,最终Counter应该为2:
但由于没有进行加锁/互斥导致执行情形如下:
线程A执行完Step1时取得counter为0,这是切换到线程B
线程B顺利执行完Step1,2,3,现在Counter为1,然后切换到A
线程A继续执行完Step2得到counter为1,然后Step3设置Counter为1。
最终结果为1.
这个比较容易理解,GIL保证python byte code在进程内同时只有一个native thread在运
行。但byte code自身的逻辑仍然需要加锁/互斥等保证线程可重入,因为byte code运行
过程中任意点都可能被打断并切换到另外的线程。
举个简单的例子:
一段计数器的代码:
// Step 1
counter = get_counter()
// Step 2
counter += 1
// Step 3
set_counter(counter)
假设初始Counter为0,在不做任何同步的情况下两个线程同时执行这段Python代码,
期望结果应该是两个线程都做了计数,最终Counter应该为2:
但由于没有进行加锁/互斥导致执行情形如下:
线程A执行完Step1时取得counter为0,这是切换到线程B
线程B顺利执行完Step1,2,3,现在Counter为1,然后切换到A
线程A继续执行完Step2得到counter为1,然后Step3设置Counter为1。
最终结果为1.