python多线程,线程同步的问题

方舟编译器 发布于 2014/08/21 14:42
阅读 672
收藏 0

线程好像一直在执行,不知道咋回事,附代码如下


from threading import Thread, RLock
mlock = RLock()




class MyThread(Thread):


    def __init__(self, name):
        super(MyThread, self).__init__()
        self.setName(name)
        self.ages = [1,2,3,4,5,6,7,8,9]


    def run(self):
        while True:
            mlock.acquire()
            length = len(self.ages)
            if length:
                print self.ages.pop()
            else:
                mlock.release()
                break


if __name__ == '__main__':
    ta = MyThread('A')
    tb = MyThread('B')
    tc = MyThread('C')


    ta.start()
    tb.start()
    tc.start()

加载中
0
猪肉炖粉条
猪肉炖粉条
def run(self):
        while True:
            try:
                mlock.acquire()
                length = len(self.ages)
                if length:
                    print self.ages.pop()
                else:
                    break
            finally:
                mlock.release()

方舟编译器
方舟编译器
我刚按你说的运行了下,这把self.ages里的元素打印了三遍,我是想三个线程打印一遍
0
Xomas
Xomas
已经死锁了,你 acquire()多少次,就要release()多少次。你这个完全没有必要加锁,self.ages都是各自线程私有的。
方舟编译器
方舟编译器
那我怎么怎么用三个线程打印self.ages 的元素啊
0
gotham
gotham

打印一遍得把ages 放外面。

另外死锁的问题在 print self.ages.pop() 后面也加mlock.release()就可以。

改后的代码如下。

from threading import Thread, RLock
mlock = RLock()
ages = [1,2,3,4,5,6,7,8,9]
class MyThread(Thread):
    def __init__(self, name):
        super(MyThread, self).__init__()
        self.setName(name)
        #self.ages = [1,2,3,4,5,6,7,8,9]
    def run(self):
        while True:
            mlock.acquire()
            length = len(ages)
            if length:
                print ages.pop()
                mlock.release()
            else:
                mlock.release()
                break




if __name__ == '__main__':
    ta = MyThread('A')
    tb = MyThread('B')
    tc = MyThread('C')
    ta.start()
    tb.start()
    tc.start()

0
方舟编译器
方舟编译器

引用来自“gotham”的评论

打印一遍得把ages 放外面。

另外死锁的问题在 print self.ages.pop() 后面也加mlock.release()就可以。

改后的代码如下。

from threading import Thread, RLock
mlock = RLock()
ages = [1,2,3,4,5,6,7,8,9]
class MyThread(Thread):
    def __init__(self, name):
        super(MyThread, self).__init__()
        self.setName(name)
        #self.ages = [1,2,3,4,5,6,7,8,9]
    def run(self):
        while True:
            mlock.acquire()
            length = len(ages)
            if length:
                print ages.pop()
                mlock.release()
            else:
                mlock.release()
                break




if __name__ == '__main__':
    ta = MyThread('A')
    tb = MyThread('B')
    tc = MyThread('C')
    ta.start()
    tb.start()
    tc.start()

有道理,可是类里面读外面的变量,会不会有点变量混乱啊
gotham
gotham
如果你要每个线程一个ages,你需要在__init__的时候传值进去,然后不用锁就可以。现在的做法是几个线程用一个ages,所有要锁。
0
一直磨刀

1.如果想法是要三个线程共同打印一个数组里面的东西,那需要把数组变成公共资源。

2.死锁问题,一定要记住,每一次获得锁,都需要解锁,不然其他线程(包括本身)没有办法获得这个锁。

3.如果希望看到三个线程交替打印,除了需要释放锁外,还需要释放另外一个公共资源-cpu,最简单的办法就是在循环中放个sleep,这样其他的阻塞的线程才有足够的cpu时间去拿到锁,进而交替运行。

方舟编译器
方舟编译器
这个我得实践下
返回顶部
顶部