我正在学习使用Python进行并发编程。
在以下代码中,我似乎遇到了同步问题。我该如何解决?
import threading
N = 1000000
counter = 0
def increment():
global counter
for i in range(N):
counter += 1
t1 = threading.Thread(target=increment)
t2 = threading.Thread(target=increment)
t1.start()
t2.start()
t1.join()
t2.join()
print(counter)
答案 0 :(得分:1)
两个线程都试图同时修改counter
,有时甚至会修改。这导致一些增量不出现。这是使用threading.Lock
解决该问题的简单方法:
import threading
N = 1000000
counter = 0
def increment(theLock):
global counter
for i in range(N):
theLock.acquire()
counter += 1
theLock.release()
lock = threading.Lock()
t1 = threading.Thread(target=increment, args=[lock,])
t2 = threading.Thread(target=increment, args=[lock,])
t1.start()
t2.start()
t1.join()
t2.join()
print(counter)
必须保护theLock.acquire()
和theLock.release()
环绕代码,使其一次只能在一个线程中运行。在您的示例中,获取和释放也可能围绕整个循环,但这与不使用多处理相同。请参阅threading documentation,尤其是Lock Objects
部分。