「Python」线程间同步的实现与代码

「Python」线程间同步的实现与代码线程间同步常用线程间同步的方法有:临界区:通过对多线程的串行化来访问公共资源或一段代码速度快,适合控制数据访问在任意时刻只允许一个线程访问共享资

欢迎大家来到IT世界,在知识的湖畔探索吧!

线程间同步

常用线程间同步的方法有:

  1. 临界区:通过对多线程的串行化来访问公共资源或一段代码
  2. 速度快,适合控制数据访问
  3. 在任意时刻只允许一个线程访问共享资源,当有一个线程进入后,其他试图访问共享资源的线程将会被挂起,并一直等到进入临界区的线程离开,临界在被释放后,其他线程才可以抢占
  4. 互斥量:为协调对一个共享资源的单独访问而设计
  5. 只有拥有互斥量的线程,才有权限去访问系统的公共资源
  6. 互斥量只有一个,所以能够保证资源不会同时被多个线程访问
  7. 互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享
  8. 信号量:为控制一个具有有限数量的用户资源而设计
  9. 它允许多个线程在同一个时刻去访问同一个资源,但一般需要限制同一时刻访问此资源的最大线程数目
  10. 事件:用来通知线程有一些事件已发生,从而启动后继任务的开始

Python 中的互斥锁

互斥量又称为互斥锁,Python 的 threading 模块中定义了 Lock 类,可以方便地处理锁定。一旦某个线程获得了这个锁,其他的线程再要想获得这个锁就必须阻塞,直到锁被释放。

  • 创建一个锁: mutex = threading.Lock()
  • 获得一个锁: mutex.acquire([blocking=True, timeout=-1]) 成功获得锁时返回 true blocking 为 ture 时,以阻塞方式获得锁,即要等到锁释放后方能加锁 timeout 为超时时间,如果设定了 timeout,则在超时后通过返回值可以判断是否得到了锁,从而可以进行一些其他的处理
  • 释放一个锁: mutex.release()

举个例子

import threading

num = 0
mutex = threading.Lock()  # 创建一个锁

def add():
    """ num 数值每次加 1,执行 1000000 次"""
    global num
    for _ in range(1000000):
        if mutex.acquire():
            num += 1
            mutex.release()
            
t1 = threading.Thread(target= add)
t2 = threading.Thread(target= add)

# 开始线程
t1.start()
t2.start()

# 等待线程结束
t1.join()
t2.join()

print(num)
复制代码

欢迎大家来到IT世界,在知识的湖畔探索吧!

运行代码,可以看到输出 2000000 ,如果去掉代码中的加锁和释放锁的语句,则会得到不符合预期的结果。

作者:Hazelnut
链接:https://juejin.cn/post/7056682944252870687
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/35608.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信