鼠…鼠标放错地方了!

随笔- 39  文章- 0  评论- 1  阅读- 17万 
进程锁(线程锁同进程锁相同,将模块以及创建进程改为线程即可)
复制代码
import multiprocessing  #导入multiprocessing模块

def func(lock):
    #lock.acquire  #创建锁
    with lock:  #使用with lock:pass 语句,可以替代创建和释放锁的过程
        pass
    #lock.release  #释放锁

if __name__ == '__main__':
    lock = multiprocessing.Lock()
    for num in range(10): #循环创建
        #主要参数:target为执行函数 lock作为参数传入函数
        p = multiprocessing.Process(target=func,args=(lock,))
        p.start()  #进程开始
复制代码
进程信号量(线程信号量同进程信号量相同,将模块以及创建进程改为线程即可)
复制代码
import multiprocessing

def func(lock):
    with lock:
        pass

if __name__ == '__main__':
    se = multiprocessing.Semaphore(5)  #设置进程信号量
    for num in range(10):
        #主要参数:target为执行函数 se作为参数传入函数
        p = multiprocessing.Process(target=func,args=(se,))
        p.start()
复制代码
递归锁

理解:这里循环创建的10个线程,都需要资源1和资源2,当我们某个线程抢占到资源1,而另一个线程抢占到资源2,就会形成死锁状态,引入递归锁(解决办法之一)

  • 创建递归锁,当func1中的资源1被某个线程抢占,递归锁计数加一,而func2中的递归锁计数也加一,此时其他线程不在对资源2进行抢占,待func1中执行完毕,将锁释放完毕,递归锁计数为0,所有线程开始对资源进行抢占,直到递归锁计数加一
  • 此时func1中和func2中都创建有递归锁,他们抢占的资源中含有共享资源,所以我们需要将func1和func2中都创建递归锁,若此时有func3,并不需要资源1和资源2,那么则无需在func3中创建递归锁,只需在抢占共享资源时设置递归锁
复制代码
import threading

class MyThread(threading.Thread):

    def func1(self):
        rlock.acquire()
        代码块(含有共同需要的资源1)
        rlock.acquire()
        代码块(含有共同需要的资源2)
        rlock.release()
        rlock.release()

    def func2(self):
        rlock.acquire()
        代码块(含有共同需要的资源2)
        rlock.acquire()
        代码块(含有共同需要的资源1)
        rlock.release()
        rlock.release()

    def run(self):
        self.func1()
        self.func2()


if __name__ == '__main__':
    rlock = threading.RLock()  #创建递归锁
    for x in range(10):  #循环创建10个线程
        t = MyThread()
        t.start()
复制代码

 

 posted on   xiao韩de博客  阅读(307)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示