一、允许一个资源最多由几个线程同时进行

命令行:threading.Semaphore(个数)

代表现在最多有几个线程可以进行操作

import threading

import time

#参数定义了最多几个线程可以使用资源

semaphore = threading.Semaphore(3)#这里就是指最多有三个线程可以进行操作

def func():

    if semaphore.acquire():

        for i in range(2):

            print(threading.current_thread().getName() + "get semapore")

        time.sleep(5)

        semaphore.release()

        print(threading.current_thread().getName() + "release semaphore")

for i in range(8):

    t1 = threading.Thread(target=func,args=())

    t1.start()

二、Timer讲解

格式:threading.Timer(时间间隔,函数)

代表这个函数在“时间间隔”的时间之后启动

def func2():

    print("I am running.....")

    time.sleep(3)

    print("I an done.......")

if __name__ == "__main__":

    t2 = threading.Timer(6,func2) #代表6秒之后开始启动线程func2

    t2.start()

    i = 0

    while True:

        print("{0}*********".format(i))

        time.sleep(3)

        i += 1

三、可重入锁

1.一个锁可以被一个线程多次申请

2.主要解决递归调用的时候哦,需要申请锁的情况,可以防止被锁住,重新申请

class MyThread(threading.Thread):

    def run(self):

        global num

        time.sleep(1)

        if mutex.acquire(1):

            num = num+1

            msg = self.name + " set num to "+str(num)

            print(msg)

            mutex.acquire()

            mutex.release()

            mutex.release()

def test():

    for i in range(5):

        t3 = MyThread()

        t3.start()

if __name__ == "__main__":

    num = 0

    mutex = threading.RLock()#可重入锁

    test()

解释:我们的线程可以直接进行,不会因为一个申请了,就会被阻塞,依然还可以申请这把锁

四、源码

d25_4_Rlock.py

https://github.com/ruigege66/Python_learning/blob/master/d25_4_Rlock.py

2.CSDN:https://blog.csdn.net/weixin_44630050(心悦君兮君不知-睿)

3.博客园:https://www.cnblogs.com/ruigege0000/

4.欢迎关注微信公众号:傅里叶变换,后台回复”礼包“,获取大数据学习资料

Python连载36-线程数量限制、Timer、可重入锁的更多相关文章

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

    不多解释,预防普通锁不正规的获取与释放 #!/usr/bin/env python # -*- coding: utf-8 -*- import threading import time class ...

  2. [Python 多线程] RLock可重入锁 (九)

    RLock 可重复锁,是线程相关的锁.同样是线程相关的还有threading.local. 线程A获得可重用锁,并可以多次成功获取,不会阻塞.最后要再线程A中和acquire次数相同的release. ...

  3. 举例讲解Python中的死锁、可重入锁和互斥锁

    举例讲解Python中的死锁.可重入锁和互斥锁 一.死锁 简单来说,死锁是一个资源被多次调用,而多次调用方都未能释放该资源就会造成死锁,这里结合例子说明下两种常见的死锁情况. 1.迭代死锁 该情况是一 ...

  4. java线程的同步控制--重入锁ReentrantLock

    我们常用的synchronized关键字是一种最简单的线程同步控制方法,它决定了一个线程是否可以访问临界区资源.同时Object.wait() 和Object.notify()方法起到了线程等待和通知 ...

  5. Python连载32-多线程其他属性以及继承Thread类

    一.线程常用属性 1.threading.currentThread:返回当前线程变量 2.threading.enumerate:返回一个包含正在运行的线程的list,正在运行的线程指的是线程启动后 ...

  6. 05.线程在睡眠时拥有的监视器资源不会被释放(这里使用重入锁ReentrantLock)

    import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public clas ...

  7. Python连载30-多线程之进程&线程&线程使用举例

    一.多线程 1.我们的环境 (1)xubuntu 16.04(2)anaconda(3)pycharm(4)python 3.6 2.程序:一堆代码以文本的形式存入一个文档 3.进程:程序运行的一个状 ...

  8. python threading编程中的LOCK和RLOCK(可重入锁)

    找到一本PYTHON并发编辑的书, 弄弄.. #!/usr/bin/env python # -*- coding: utf-8 -*- import threading import time sh ...

  9. python同步原语--线程锁

    多线程锁是python多种同步原语中的其中一种.首先解析一下什么是同步原语,python因为GIL(全局解析锁)的缘故,并没有真正的多线性.另外python的多线程存在一个问题,在多线程编程时,会出现 ...

随机推荐

  1. 说说 Vue.js 中的 v-cloak 指令

    可以使用 v-cloak 指令设置样式,这些样式会在 Vue 实例编译结束时,从绑定的 HTML 元素上被移除. 当网络较慢,网页还在加载 Vue.js ,而导致 Vue 来不及渲染,这时页面就会显示 ...

  2. 使用requests模块进行封装,帮你如何处理restful类型的接口

    import requests import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) c ...

  3. python 操作zookeeper详解

    ZooKeeper 简介 ZooKeeper 是一个分布式的.开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 Hbase 的重要组件.它是一 ...

  4. Http Header的Transfer-Encoding

    Transfer-Encoding,是一个 HTTP 头部字段,字面意思是「传输编码」.实际上,HTTP 协议中还有另外一个头部与编码有关:Content-Encoding(内容编码).Content ...

  5. mysql 5.7 创建用户报错ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value

    如: INSERT INTO user (host, user, authentication_string, select_priv, insert_priv, update_priv) VALUE ...

  6. oracle学习笔记(十七) PL/SQL高级应用

    PL/SQL高级应用 动态SQL 在PL/SQL中,不能直接执行DDL(create,alter,drop),得使用动态SQL,当然,除了DDL,动态SQL也可以执行DML(select,insert ...

  7. jsp表单数据添加到数据库

    先由表单提交数据到某验证页面:checkregister.jsp<form method="POST"name="form1" action=" ...

  8. 【Android】Context的使用

    Android开发经常需要使用Context来启动Activity,或者打开SharedPreferences,或者构建一个Dialog.最近老是用到getContext(),getApplicati ...

  9. 基于TCP连接的socket套接字编程

    基于TCP协议的套接字编程(简单) 服务端 import socket server = socket.socket() server.bind( ('127.0.0.1', 9999) ) serv ...

  10. Django—常见问题解决

    让Django项目运行允许外部访问 1.将python manage.py runserver 改为 python manage.py runserver 0.0.0.0:80 或者 python m ...