Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python如何同步线程?_Python_Multithreading_Synchronization - Fatal编程技术网

Python如何同步线程?

Python如何同步线程?,python,multithreading,synchronization,Python,Multithreading,Synchronization,我正在学习用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)

我正在学习用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)

两个线程都试图同时修改
计数器
,有时也会这样做。这会导致某些增量不出现。下面是一种使用
线程技术解决该问题的简单方法。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()
环绕必须保护的代码,一次只能在一个线程中运行。在您的示例中,获取和释放也可以围绕整个循环,但这与不使用多处理相同。请参阅,尤其是
锁定对象
部分。

请阅读并遵循帮助文档中的发布指南,正如您创建此帐户时建议的那样。适用于这里。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您描述的问题。什么是“同步问题”?可能重复的