类变量与线程- 意外行为

2 投票
1 回答
1622 浏览
提问于 2025-04-17 00:26

我遇到了一个关于线程的意外情况。下面我附上了一个简单的例子来展示这个情况:

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。我在使用线程锁的时候做对了吗?这个类只有一个实例,我已经让线程访问这个类是有序的,那为什么类的变量没有递增呢?

1 个回答

3

你现在用的不是“线程锁”,而是“进程锁”。因为进程之间不共享堆内存的内容,所以每次调用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()

撰写回答