PYTHON线程知识再研习D---可重入锁

不多解释,预防普通锁不正规的获取与释放

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import threading
import time

class MyThread(threading.Thread):
    def run(self):
        global num
        time.sleep(1)

        if mutex.acquire(1):
            num += 1
            msg = self.name + ‘ set num to ‘ + str(num)
            print msg
            mutex.acquire()
            mutex.release()
            mutex.release()

num = 0
mutex = threading.RLock()
def test():
    for i in range(5):
        t = MyThread()
        t.start()
    t.join()
    print ‘ALL DONE‘

if __name__ == ‘__main__‘:
    test()
时间: 2024-10-15 01:31:42

PYTHON线程知识再研习D---可重入锁的相关文章

PYTHON线程知识再研习A

前段时间看完LINUX的线程,同步,信息号之类的知识之后,再在理解PYTHON线程感觉又不一样了. 作一些测试吧. thread:模块提供了基本的线程和锁的支持 threading:提供了更高级别,功能更强的线程管理的功能 Queue:允许用户创建一个可以用于多个线程之间共享数据的队列数据结构 #!/usr/bin/env python # -*- coding: utf-8 -*- import thread from time import sleep, ctime loops = [4,2

PYTHON线程知识再研习F---队列同步Queue

让我们考虑更复杂的一种场景:产品是各不相同的.这时只记录一个数量就不够了,还需要记录每个产品的细节.很容易想到需要用一个容器将这些产品记录下来. Python的Queue模块中提供了同步的.线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列 LifoQueue,和优先级队列PriorityQueue.这些队列都实现了锁原语,能够在多线程中直接使用.可以使用队列来实现线程间的同步. #!/usr/bin/env python # -*- coding: utf-8

PYTHON线程知识再研习E---条件变量同步Condition

Python提供的Condition对象提供了对复杂线程同步问题的支持.Condition被称为条件变量,除了提供与Lock类似的 acquire和release方法外,还提供了wait和notify方法.线程首先acquire一个条件变量,然后判断一些条件.如果条件不满足则 wait:如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件.不断的重复 这一过程,从而解决复杂的同步问题. 可以认为Condition对象维护了一个

PYTHON线程知识再研习C---线程互斥锁

结合例子,就很好理解了. 就是不要让共享变量被各个线程无序执行,导致结果不可预期 threading模块中定义了Lock类,可以方便的处理锁定: #创建锁mutex = threading.Lock()#锁定mutex.acquire([timeout])#释放mutex.release() 其中,锁定方法acquire可以有一个超时时间的可选参数timeout.如果设定了timeout,则在超时后通过返回值可以判断是否得到了锁,从而可以进行一些其他的处理. #!/usr/bin/env pyt

PYTHON线程知识再研习B

使用threading.Thread模块,也有两种使用方法,可以用类,也可以在实例化对象中传入函数或类实例. #!/usr/bin/env python # -*- coding: utf-8 -*- from threading import Thread import time def run_thread(n): for i in range(n): print i class race(Thread): def __init__(self,threadname,interval): Th

python多线程编程(3): 死锁和可重入锁

死锁 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁.尽管死锁很少发生,但一旦发生就会造成应用的停止响应.下面看一个死锁的例子: 按 Ctrl+C 复制代码 按 Ctrl+C 复制代码 执行结果: Thread-1 got resAThread-1 got resBThread-1 got resBThread-1 got resAThread-2 got resAThread-2 got resBThread-2 got resBThread-2

重入锁 ReentrantLock (转)(学习记录)

重入锁(ReentrantLock)是一种递归无阻塞的同步机制.以前一直认为它是synchronized的简单替代,而且实现机制也不相差太远.不过最近实践过程中发现它们之间还是有着天壤之别. 以下是官方说明:一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大.ReentrantLock 将由最近成功获得锁定,并且还没有释放该锁定的线程所拥有.当锁定没有被另一个线程所拥有时,调用 lock 的线程将成功获取

36 线程 队列 守护线程 互斥锁 死锁 可重入锁 信号量

线程 线程是操作系统最小的运算调度单位,被包含在进程中,一个线程就是一个固定的 执行流程 线程和进程的关系 线程不能单独存在 必须存在于进程中, 进程是一个资源单位,其包含了运行程序所需的所有资源 线程才是真正的执行单位 没有线程,进程中的资源无法被利用起来,所以一个进程至少包含一个线程,称之为主线程 当我们启动一个程序时,操作系统就会自己为这个程序创建一个主线程 线程可以由程序后期开启 ,自己开启线程称之为子线程 为什么需要线程 目的只有一个就是提高效率 就像一个车间 如果产量跟不上 就再造一

Python36 1.joinablequeue 2.线程理论 3.多线程对比多进程 4.线程的使用方式 4.1.产生 线程的两种方式 4.2.守护线程 4.3.线程安全问题 4.3.1.互斥锁 4.3.2.死锁 4.3.3.可重入锁 4.3.4.信号量

复习1.守护进程2.互斥锁(解决数据错乱的方法)3.IPC(进程间通讯)4.生产者与消费者模型 详解:1.守护进程 一个进程可以设为另一个进程的守护进程 特点:被守护的进程结束时,守护进程也会随之结束 本质:父进程交给子进程一个任务,然而父进程 先于子进程结束了,子进程的任务也就没有必要 继续执行了 格式:开始前加 p.daemon=True 2.互斥锁(解决数据错乱的方法)方法一:互斥锁 互斥 互相排斥 锁的本质:一个标志 标志的两个状态: 1.锁定 2.未锁定 什么时候用? 当多个进程要操作