Python的互斥锁与信号量

并发与锁

  • a. 多个线程共享数据的时候,如果数据不进行保护,那么可能出现数据不一致现象,使用锁,信号量、条件锁

    • b.

      • c.互斥锁
        1. 互斥锁,是使用一把锁把代码保护起来,以牺牲性能换取代码的安全性,那么Rlock后 必须要
        relase 解锁 不然将会失去多线程程序的优势
        2. 互斥锁的基本使用规则:

        1 import threading
        2 # 声明互斥锁
        3 lock=threading.Rlock();
        4 def handle(sid):# 功能实现代码
        5 lock.acquire() #加锁
        6 # writer codeing
        7 lock.relase() #释放锁

        8
        信号量:
        1. 调用relarse()信号量会+1 调用 acquire() 信号量会-1
        a. 可以理解为对于临界资源的使用,以及进入临界区的判断条件
        2. semphore() :当调用relarse()函数的时候 单纯+1 不会检查信号量的上限情况。 初
        始参数为0
        3. boudedsemphore():边界信号量 当调用relarse() 会+1 , 并且会检查信号量的上
        限情况。不允许超过上限
        a. 使用budedsemaphore时候不允许设置初始为0,将会抛出异常
        b. 至少设置为1 ,如consumer product 时候应该在外设置一个变
        量,启动时候对变量做判断,决定使不使用acquier
        4. 信号量的基本使用代码:

        1 # 声明信号量:
        2 sema=threading.Semaphore(0); #无上限检查
        3 sema=threading.BuderedSeamphore(1) #有上限检查设置
        4 5
        apple=1
        6 def consumner():
        7 seam.acquire(); # ‐1
        8 9
        if apple==1:
        10 pass
        11 else: sema2.release();#+ 1
        12 def product():
        13 seam.relarse(); # +1
        14 if apple==1:
        15 pass
        16 else:
        17 print("消费:",apple);
        18
        
      • 全部的代码:
      • # -*- coding: utf-8 -*-
        """
        Created on Mon Sep  9 21:49:30 2019
        
        @author: DGW-PC
        """
        # 信号量解决生产者消费者问题
        import random;
        import threading;
        import time;
        
        # 声明信号量
        sema=threading.Semaphore(0);# 必须写参数 0 表示可以使用数
        sema2=threading.BoundedSemaphore(1);
        
        apple=1;
        
        def product():#生产者
            global apple;
            apple=random.randint(1,100);
            time.sleep(3);
            print("生成苹果:",apple);
            #sema2.release(); # +1
            if apple==1:
                 pass
            else: sema2.release();#+ 1 
        
        def consumer():
            print("等待");
            sema2.acquire();# -1
            if apple==1:
                pass
            else:
                print("消费:",apple);
        
        threads=[];
        
        for i in range(1,3):
            t1=threading.Thread(target=consumer);
            t2=threading.Thread(target=product);
            t1.start();
            t2.start();
            threads.append(t1);
            threads.append(t2);
        for x in threads:
            x.join();
        

原文地址:https://www.cnblogs.com/dgwblog/p/11494915.html

时间: 2024-10-03 04:50:35

Python的互斥锁与信号量的相关文章

python线程互斥锁Lock(29)

在前一篇文章 python线程创建和传参 中我们介绍了关于python线程的一些简单函数使用和线程的参数传递,使用多线程可以同时执行多个任务,提高开发效率,但是在实际开发中往往我们会碰到线程同步问题,假如有这样一个场景:对全局变量累加1000000次,为了提高效率,我们可以使用多线程完成,示例代码如下: # !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解忧 @Blog(个人博客地址): shuopython

Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型

一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例子 #并发运行,效率高,但竞争同一打印终端,带来了打印错乱 from multiprocessing import Process import os,time def work(): print('%s is running' %os.getpid()) time.sleep(2) print('

【Python下进程同步之互斥锁、信号量、事件机制】 -- 2019-08-16 17:58:28

原文: http://blog.gqylpy.com/gqy/229 " 一.锁机制:??multiprocess.Lock 上篇博客中,我们千方百计实现了程序的异步,让多个任务同时在几个进程中并发处理,但它们之间的运行没有顺序.尽管并发编程让我们能更加充分的利用io资源,但是也给我我们带来了新问题,多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题. 例: # 多进程抢占输出资源 from multiprocessing import Process from os import

【Python下进程同步之互斥锁、信号量、事件机制】 𪕽

原文: http://blog.gqylpy.com/gqy/229 " 一.锁机制:??multiprocess.Lock 上篇博客中,我们千方百计实现了程序的异步,让多个任务同时在几个进程中并发处理,但它们之间的运行没有顺序.尽管并发编程让我们能更加充分的利用io资源,但是也给我我们带来了新问题,多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题. 例: # 多进程抢占输出资源 from multiprocessing import Process from os import

线程同步(互斥锁与信号量的作用与区别)

“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在 哪里).而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这 个资源.比如对全局变量的访问,有时要加锁,操作完了,在解锁.有的时候锁和信号量会同时使用的” 也就是说,信号量不一定是锁定某一个资源,而是流程上的概念,比如:有A,B两个线程,B线程要等A线程完成某一任务以后

互斥锁、信号量、条件变量的区别

来自:http://blog.chinaunix.net/space.php?uid=23061624&do=blog&cuid=2127853 信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里).而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源.比如对全局变量的访问,有时要加锁,操作完了,在解锁.有

守护进程,模拟抢票例子,互斥锁,信号量,队列总结

 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children 注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止 # 守护进程 from multiprocessing import Process import os,time,random def task(): print('%s

多进程(了解),守护进程,互斥锁,信号量,进程Queue与线程queue

一.守护进程 主进程创建守护进程,守护进程的主要的特征为:①守护进程会在主进程代码执行结束时立即终止:②守护进程内无法继续再开子进程,否则会抛出异常. 实例: from multiprocessing import Process from threading import Thread import time def foo(): # 守护进程 print(123) time.sleep(1) print("end123") def bar(): print(456) time.sl

互斥锁,信号量,条件变量,读写锁

互斥锁 互斥锁的特性: 1. 原子性:当有一个线程成功拿到了这个锁,其他线程都无法在相同的时间拿到这个锁 2. 唯一性:在一个线程拿到锁的这段时间,只有当这个线程把锁释放掉,其他的线程才有可能拿到 3. 非繁忙等待性:如果一个线程已经锁定了一个互斥量,第二个线程又视图去拿到这个锁的前线,则第二个锁将被挂起,等待第一个线程对互斥量解锁位置,同时第二个线程获取锁,继续往下执行 pthread_mutex_init pthread_mutex_lock pthread_mutex_trylock pt