Python进程同步之lock、semphore

前言

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

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

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

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

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

进程同步

Lock

多个进程在访问共享资源时,为了保证资源被访问时的有序性,我们需要对多进程进行同步管理,可以使用Lock

from multiprocessing import Lock
lock = Lock()
lock.acquire() 
# 其中包含的业务逻辑将被锁加持,其他进程在没有获取锁时,无法访问资源
lock.release()
# 释放锁
  • 锁还可以通过上下文语句进行使用
with lock:
  	do something...
  • 代码示例
from multiprocessing import Lock,Process,current_process
import time

def work_1(lock):
    lock.acquire()
    for var in range(10):
        print(var)
        time.sleep(0.5)
    lock.release()

def work_2(lock):
    with lock:
        for var in range(10,20):
          	print(var)

def main():
    lock = Lock()
    p1 = Process(target=work_1,args=(lock,))
    p2 = Process(target=work_2,args=(lock,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

if __name__ == '__main__':
	main()
Semphore

lock是一把锁,SemaphoreN把锁,可以使多个进程同时持有,同时访问锁住的资源

semphore也叫做信号量

信号量一般用在某些资源可以被多个进程同时并发访问,构成多进程并发同步

同样的,一个信号量可以代表一种资源

from multiprocessing import Semphore
s_lock = Semaphore(num)
s_lock.acquire() # 加持锁,每次调用,信号量减一
s_lock.release() # 释放锁,每次调用,信号量加一
  • 代码示例
from multiprocessing import Semaphore,Process,current_process
import time
def func(s_lock):
    s_lock.acquire()
    for var in range(10):
        time.sleep(0.5)
        print(var)
    s_lock.release()

def main():
    s = Semaphore(3)
    process_ = []
    for var in range(10):
      	process_.append(Process(target=func,args=(s,)))
    for _ in process_:
     	_.start()
    for _ in process_:
      	_.join()

if __name__ == '__main__':
	main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李恩泽的技术博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值