python - 类变量和线程 - 意外的行为

标签 python multithreading class call

我遇到了线程的意外行为。我在下面附加了一个简短的示例来演示该行为:

from multiprocessing import Process, Lock
import time

class inc:

    def __init__(self):
        print "Initializing a new class"
        self.value = 0

    def add_one(self):
        self.value += 1
        print self.value

def f(a,l):
    # Do something using a class call
    l.acquire()
    a.add_one()
    l.release()
    #Do something that takes a long time
    time.sleep(5)
    #Do a different thing using a class call
    l.acquire()
    a.add_one()
    l.release()

if __name__=="__main__":
    a=inc()
    lock = Lock()

    for i in range(0,4):
        Process(target=f, args=(a,lock)).start()

我正在寻找的输出是 1,2,3,4,5,6,7,8 但我得到:1,1,1,1,2,2,2,2。我是否正确使用了线程锁固?该类只存在一个实例,并且我序列化了对该类的线程访问,那么为什么类变量不增加呢?

最佳答案

您没有使用“线程锁定”,您正在使用进程锁定。由于进程不共享堆内容,因此每次 f 都会获取不同的对象。

参见threading - 用于线程操作的 Python 库。它允许您实现所需的行为。

可能只是替换

from multiprocessing import Process, Lock
...
    Process(target=f, args=(a,lock)).start()

from threading import Thread, Lock
...
    Thread(target=f, args=(a,lock)).start()

关于python - 类变量和线程 - 意外的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7213051/

相关文章:

python - 如何获得预测 future 的后续(下一个)值?

C:暂停 system() 调用

c++ - 如何初始化成员变量

java - 需要在 Java 中解析输入的指导,需要专门使用类,很难理解构造函数

python - Pandas 过滤并创建新列

python - python中的数字n和(n)有什么区别

C 测试问题中的循环缓冲区实现

具有具体方法的Python抽象类

python - 从子流程中重新引发异常

java - Java ExecutorService死锁?