Python内部是如何存储GC引用变量的计数的?
PHP中文网
PHP中文网 2017-04-18 10:08:49
0
1
499
PHP中文网
PHP中文网

认证高级PHP讲师

Antworte allen(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:

但由于没有进行加锁/互斥导致执行情形如下:

  1. 线程A执行完Step1时取得counter为0,这是切换到线程B

  2. 线程B顺利执行完Step1,2,3,现在Counter为1,然后切换到A

  3. 线程A继续执行完Step2得到counter为1,然后Step3设置Counter为1。

最终结果为1.

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!