我已经读过an article的有关Python中多线程的知识,他们尝试使用同步来解决竞争条件问题。而且我运行了以下示例代码来重现竞态条件问题:
import threading
# global variable x
x = 0
def increment():
"""
function to increment global variable x
"""
global x
x += 1
def thread_task():
"""
task for thread
calls increment function 100000 times.
"""
for _ in range(100000):
increment()
def main_task():
global x
# setting global variable x as 0
x = 0
# creating threads
t1 = threading.Thread(target=thread_task)
t2 = threading.Thread(target=thread_task)
# start threads
t1.start()
t2.start()
# wait until threads finish their job
t1.join()
t2.join()
if __name__ == "__main__":
for i in range(10):
main_task()
print("Iteration {0}: x = {1}".format(i,x))
当我使用Python 2.7.15时,它确实返回与文章相同的结果。但是当我使用Python 3.6.9时却没有(所有线程返回相同的结果= 200000)。
我想知道GIL的新实现(自Python 3.2起)是否处理了竞争条件问题?如果可以,为什么在Python> 3.2中仍然存在Lock,Mutex。如果没有,为什么在运行多线程以修改共享资源(如上例)时没有冲突?
这些天,当我试图更多地了解Python到底如何工作时,我的想法一直困扰着我们。