Day 37(07/18) 锁

2.1.2 Thread类继承式创建

#继承Thread式创建

import threading
import time

class MyThread(threading.Thread):

    def __init__(self,num):
        threading.Thread.__init__(self)
        self.num=num

    def run(self):
        print("running on number:%s" %self.num)
        time.sleep(3)

t1=MyThread(56)
t2=MyThread(78)

t1.start()
t2.start()
print("ending")

2.4 同步锁 (Lock)

import time
import threading

def addNum():
    global num #在每个线程中都获取这个全局变量
    #num-=1

    temp=num
    time.sleep(0.1)
    num =temp-1  # 对此公共变量进行-1操作

num = 100  #设定一个共享变量

thread_list = []

for i in range(100):
    t = threading.Thread(target=addNum)
    t.start()
    thread_list.append(t)

for t in thread_list: #等待所有线程执行完毕
    t.join()

print(‘Result: ‘, num)

锁通常被用来实现对共享资源的同步访问。为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁,则当前线程需等待其被释放),待资源访问完后,再调用release方法释放锁:

import threading

R=threading.Lock()

R.acquire()
‘‘‘
对公共数据的操作
‘‘‘
R.release()

扩展思考

 

2.5 死锁与递归锁

所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

import threading
import time

mutexA = threading.Lock()
mutexB = threading.Lock()

class MyThread(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        self.fun1()
        self.fun2()

    def fun1(self):

        mutexA.acquire()  # 如果锁被占用,则阻塞在这里,等待锁的释放

        print ("I am %s , get res: %s---%s" %(self.name, "ResA",time.time()))

        mutexB.acquire()
        print ("I am %s , get res: %s---%s" %(self.name, "ResB",time.time()))
        mutexB.release()
        mutexA.release()

    def fun2(self):

        mutexB.acquire()
        print ("I am %s , get res: %s---%s" %(self.name, "ResB",time.time()))
        time.sleep(0.2)

        mutexA.acquire()
        print ("I am %s , get res: %s---%s" %(self.name, "ResA",time.time()))
        mutexA.release()

        mutexB.release()

if __name__ == "__main__":

    print("start---------------------------%s"%time.time())

    for i in range(0, 10):
        my_thread = MyThread()
        my_thread.start()

在Python中为了支持在同一线程中多次请求同一资源,python提供了可重入锁RLock。这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁:

2.7 Semaphore(信号量)

Semaphore管理一个内置的计数器,
每当调用acquire()时内置计数器-1;
调用release() 时内置计数器+1;
计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。

实例:(同时只有5个线程可以获得semaphore,即可以限制最大连接数为5):

import threading
import time

semaphore = threading.Semaphore(5)

def func():
    if semaphore.acquire():
        print (threading.currentThread().getName() + ‘ get semaphore‘)
        time.sleep(2)
        semaphore.release()

for i in range(20):
  t1 = threading.Thread(target=func)
  t1.start()

应用:连接池

思考:与Rlock的区别?

http://www.cnblogs.com/yuanchenqi/articles/6755717.html (详细参考老师博客)

时间: 2024-10-14 09:52:43

Day 37(07/18) 锁的相关文章

日本IT行业劳动力缺口达22万 在日中国留学生迎来就业好时机 2017/07/18 11:25:09

作者:倪亚敏 来源:日本新华侨报 发布时间:2017/07/18 11:25:09   据日本政府提供的数据,日本2018年应届毕业生的"求人倍率"已经达到了1.78倍.换言之,就是100名大学生里有178个就业岗位可选择,即使所有大学毕业生都进入劳动力市场,也还有78个岗位空缺.劳动力现状是寒冷冬天,而学生们确实迎来了就业春天. 在众多岗位当中,日本的信息技术(IT)领域采用的外国人留学生最多.去年,已经在日本企业就职的留学生当中(除去制造行业),27.3%的毕业生进入了IT行业.根

07 | 行锁功过:怎么减少行锁对性能的影响? 学习记录

<MySQL实战45讲>07 | 行锁功过:怎么减少行锁对性能的影响?  学习记录http://naotu.baidu.com/file/4cb2c22bd1b54678bf25d8af20bc70b8?token=f63a35dd193aa811 原文地址:https://www.cnblogs.com/jtfr/p/11260309.html

37. Python 多进程锁 多进程共享内存

Lock组件 当我们用多进程来读写文件的时候,如果一个进程是写文件,一个进程是读文件, 如果两个文件同时进行,肯定是不行的,必须是文件写结束后,才可以进行读操作. 或者是多个进程在共享一些资源的时候,同时只能有一个进程进行访问,那就需要锁机制进行控制. 需求: 一个进程写入一个文件,一个进程追加文件,一个进程读文件,同时启动起来 我们可以通过进程的join()方法来实现,这是一种方法,本节用Lock(进程锁)来实现. 函数说明: # lock = multiprocessing.Lock() #

python学习第37天GIL锁、死锁现象与递归锁、信号量、Event时间、线程queue

一.GIL锁 1. 什么是GIL全局解释器锁 定义: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython's memory management is not thread-safe

07: mysql锁

1.1 mysql中锁概念 1.MyISAM和InnoDB支持的锁类型 1. 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制. 2. MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking). 3. InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁. 2.MySQL这3种锁的特性 1. 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最

07 | 行锁功过:怎么减少行锁对性能的影响?

在上一篇文章中,我跟你介绍了MySQL的全局锁和表级锁,今天我们就来讲讲MySQL的行锁. MySQL的行锁是在引擎层由各个引擎自己实现的.但并不是所有的引擎都支持行锁,比如MyISAM引擎就不支持行锁.不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度.InnoDB是支持行锁的,这也是MyISAM被InnoDB替代的重要原因之一. 我们今天就主要来聊聊InnoDB的行锁,以及如何通过减少锁冲突来提升业务并发度. 顾名思义,行锁

07.18 工作健身计划21天

1 工作计划 a知识巩固 b列出不足 c针对提升 2健身计划(每天下班半小时) a俯卧撑 b仰卧起坐 第一天: 1 百度2015ife的回顾

Linux 下 新增Oracle10g 实例 (转自http://www.cnblogs.com/lan0725/archive/2011/07/18/2109474.html)

主要分为5步:创建实例目录,创建密码文件,创建参数文件,创建建库脚本并建库,创建数据字典. 其中,需要特别注意2点: 目录的权限,即用户和所属用户组都要是oracle.可以切换到已存在的oracle用户或者以root创建,然后赋权. 创建实例的时候指定编码. 下面以 Oracle 10.2.0.1.0为例,开始创建: 说明: 此服务器上已经有一个正常运行的oracle实例cms,开机自启动,一个监听. 已有一个用户oracle,所属用户组oinstall. oracle环境变量:ORACLE_S

传智168期JavaEE Spring 姜涛 day38~day40笔记(by阿滔)(2017年3月17日20:07:18)

终于结束了三大框架SSH的学习 笔记链接 链接:http://pan.baidu.com/s/1c1Vwruw 密码:tvv7