我知道 Python 线程一次只能执行一个字节码,那么为什么线程库会提供锁呢?我假设如果一次只执行一个线程,就不会发生竞争条件。
该库提供锁、条件和信号量。这样做的唯一目的是同步执行吗?
更新:
我做了一个小实验:
from threading import Thread
from multiprocessing import Process
num = 0
def f():
global num
num += 1
def thread(func):
# return Process(target=func)
return Thread(target=func)
if __name__ == '__main__':
t_list = []
for i in xrange(1, 100000):
t = thread(f)
t.start()
t_list.append(t)
for t in t_list:
t.join()
print num
基本上我应该启动 100k 线程并递增 1。返回的结果是 99993。
a) 如果有 GIL 同步并避免竞争条件,结果怎么可能不是 99999?b) 甚至可以启动 100k OS 线程吗?
更新2,看到答案后:
如果 GIL 并没有真正提供一种方法来执行像原子递增这样的简单操作,那么将它放在那里的目的是什么?它对解决令人讨厌的并发问题没有帮助,那么为什么要实施它呢?我听说过 C 扩展的用例,有人可以举例说明吗?