美文网首页Python成为更好的自己程序员
python多线程编程: 使用互斥锁同步线程

python多线程编程: 使用互斥锁同步线程

作者: 大富帅 | 来源:发表于2016-02-22 16:13 被阅读2120次
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import time, threading
    
    # 假定这是你的银行存款:
    balance = 0
    muxlock = threading.Lock()
    
    def change_it(n):
        # 先存后取,结果应该为0:
        global balance
        balance = balance + n
        balance = balance - n
    
    def run_thread(n):
        # 循环次数一旦多起来,最后的数字就变成非0
        for i in range(100000):
            change_it(n)
    
    t1 = threading.Thread(target=run_thread, args=(5,))
    t2 = threading.Thread(target=run_thread, args=(8,))
    t3 = threading.Thread(target=run_thread, args=(9,))
    t1.start()
    t2.start()
    t3.start()
    t1.join()
    t2.join()
    t3.join()
    print balance
    

    结果 :

    [/data/web/test_python]$ python multhread_threading.py
    0
    [/data/web/test_python]$ python multhread_threading.py
    61
    [/data/web/test_python]$ python multhread_threading.py
    0
    [/data/web/test_python]$ python multhread_threading.py
    24
    

    互斥锁同步

    上面的例子引出了多线程编程的最常见问题:数据共享。当多个线程都修改某一个共享数据的时候,需要进行同步控制。
    线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。互斥锁为资源引入一个状态:锁定/非锁定。某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。

    threading模块中定义了Lock类,可以方便的处理锁定:

    #创建锁mutex = threading.Lock()
    #锁定mutex.acquire([timeout])
    #释放mutex.release()
    

    其中,锁定方法acquire可以有一个超时时间的可选参数timeout。如果设定了timeout,则在超时后通过返回值可以判断是否得到了锁,从而可以进行一些其他的处理。
    使用互斥锁实现上面的例子的代码如下:

    
    balance = 0
    muxlock = threading.Lock()
    
    def change_it(n):
        # 获取锁,确保只有一个线程操作这个数
        muxlock.acquire()
        global balance
        balance = balance + n
        balance = balance - n
       # 释放锁,给其他被阻塞的线程继续操作
        muxlock.release()
    
    def run_thread(n):
        for i in range(10000):
            change_it(n)
    

    加锁后的结果,就能确保数据正确:

    [/data/web/test_python]$ python multhread_threading.py
    0
    [/data/web/test_python]$ python multhread_threading.py
    0
    [/data/web/test_python]$ python multhread_threading.py
    0
    [/data/web/test_python]$ python multhread_threading.py
    0
    
    

    相关文章

      网友评论

      本文标题:python多线程编程: 使用互斥锁同步线程

      本文链接:https://www.haomeiwen.com/subject/tcjbkttx.html