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