84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
认证高级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.