Python线程同步之lock、semphore、queue

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

线程同步

锁和信号量
  • 通过信号量,也是LockSemphore,可以保证一个线程结束之后另一个线程在开始
lock = Lock() # 线程互斥锁Lock
s = Semaphore(10) # 信号量Semaphore
  • 示例代码
from threading import Thread,Lock,Semaphore,current_thread
import time
def work(s,obj):
    with s:
        time.sleep(0.5) # 类似等待IO
        obj[0] += 1
        print(obj)

def main():
    work_list = []
    obj = [0]
    #s = Lock()
    s = Semaphore(3)
    for var in range(10):
        work_list.append(Thread(target=work,args=(s,obj)))
    for func in work_list:
        func.start()
    for func in work_list:
        func.join()

if __name__ == '__main__':
    main()
线程队列

Queue为安全队列,类似进程中Queue,内部实现了锁;通过控制线程对于Queue数据的操作,间接的实现同步

from queue import Queue
q = Queue(maxsize) # 如果给定参数为指定大小队列,如果没有给该参数,为无限队列
q.qsize() # 返回队列大小
q.empty() # 判断是否为空,为空时get抛出异常
q.full() # 判断是否队列已满,满时put抛出异常
q.get(block=True) #	从队列中取值,取不到则阻塞
q.put(block=True)	# 放一个值到队列里,放不进去则阻塞qu'bu
  • 示例代码
from threading import Thread, Lock, Semaphore,current_thread
from queue import Queue
import time
def work(q):
    for var in range(10):
        value = q.get()
        print(current_thread().name,':',value)

def main():
    q = Queue()
    work_list = []
    t = Thread(target=work,args=(q,))
    t.start()
    for var in range(10):
        q.put(var)
        time.sleep(0.5) # 存放数据等到.5s
    t.join()

if __name__ == '__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李恩泽的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值