python 信号量_Python的互斥锁与信号量详解

news/2024/7/6 0:29:07

并发与锁

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

互斥锁

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

2. 互斥锁的基本使用规则:

import threading

# 声明互斥锁

lock=threading.Rlock();

def handle(sid):# 功能实现代码

lock.acquire() #加锁

# writer codeing

lock.relase() #释放锁

信号量:

1. 调用relarse()信号量会+1 调用 acquire() 信号量会-1

可以理解为对于临界资源的使用,以及进入临界区的判断条件

2. semphore() :当调用relarse()函数的时候 单纯+1 不会检查信号量的上限情况。 初始参数为0

3. boudedsemphore():边界信号量 当调用relarse() 会+1 , 并且会检查信号量的上限情况。不允许超过上限

使用budedsemaphore时候不允许设置初始为0,将会抛出异常

至少设置为1 ,如consumer product 时候应该在外设置一个变量,启动时候对变量做判断,决定使不使用acquier

4. 信号量的基本使用代码:

# 声明信号量:

sema=threading.Semaphore(0); #无上限检查

sema=threading.BuderedSeamphore(1) #有上限检查设置

5

apple=1

def consumner():

seam.acquire(); # ‐1

9

if apple==1:

pass

else: sema2.release();#+ 1

def product():

seam.relarse(); # +1

if apple==1:

pass

else:

print("消费:",apple);

全部的代码:

# -*- 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();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。


http://www.niftyadmin.cn/n/1999555.html

相关文章

opencl获取gpu信息_国产GPU目前对于OpenGL、OpenCL的支持都如何?

为了回答这个问题,我特意去查了一下国内GPU第一的厂商景嘉微,从目前的产品线来看,已经上市的两款主打产品是JM7200和JM7201,由于官网有关这两款芯片的介绍实在太少,有一些数据可能不准确。我们先来看这两款产品的一些参…

基于Visual Studio 2003/2005的Office插件开发FAQ

基于Visual Studio 2003/2005的Office插件开发FAQ 最近处理了好几个Office Addin的问题,总结出一些经验,在此与大家分享一下。首先介绍一些注意点1. 一定要把宏安全级别设置为Medium以下,默认是High,肯定不允许运行任何Addin&…

es6中新增数组的方法

1. Array.from 这个东西就是把一些集合,或者长的像数组的伪数组转换成真的数组,比如arguments,js选择器找到dom集合, 还有对象模拟的数组 var obj { 0 : 1, length : 1 } Array.from(obj / arguments / 伪数组) //返回的是一个数组 [].slice…

nvidia控制面板点了没反应win7_Win7系统打不开Nvidia控制面板提示“停止工作”怎么办...

众所周知,显卡是win7系统电脑中比较重要的部件,如果显卡出现问题,会导致显示屏打不开或者显示画面看不请,还好Win7系统中有个Nvidia控制面板,能够对显卡进行设置,提升显卡功能。但有用户说打不开Nvidia控制…

历史上死的最窝囊的十个男人

历史上死的最窝囊的十个男人 评选的标准是:入选的人都是是当时的英雄人物。所谓是指他们或者由于不应该有的失误,或者由于命运的捉弄,很丢人地死去了,根本不符合自己的地位。而如果他们不死,是很有可能改变历史的。…

python文件操作学习笔记

#文件操作:读:f open("/Users/zhouhaijun/python/01.py","r")x f.read()print x写:f open("/Users/zhouhaijun/python/file_01.py","wb")f.write("ok")f.close()读:f open("/Use…

php 依赖注入 数据库切换_PHP控制反转(IOC)和依赖注入(DI)

先看一个例子&#xff1a;<?phpclass A {public $b;public $c;public function A(){//TODO}public function Method(){$this->bnew B();$this->cnew C();$this->b->Method();$this->c->Method();//TODO} }class B {public function B(){//TODO}public fu…

Windows 进程

系统进程 [system process] alg.exe csrss.exe ddhelp.exe dllhost.exe explorer.exe inetinfo.exe internat.exe kernel32.dll lsass.exe mdm.exe mmtask.tsk mprexe.exe msgsrv32.exe mstask.exe regsvc.exe rpcss.exe services.exe smss.exe snmp.exe spool32.exe spoolsv.e…