1. #!/usr/bin/env python
    # -*- coding:utf-8 -*-
  2.  
  3. import threading
    import time
    import random
  4.  
  5. # 1-互斥锁 Lock 同一时刻只能有1个线程运行,需要将锁传给任务函数
    number = 0
    lock = threading.Lock()
  6.  
  7. def plus(lk):
    global number
  8.  
  9. #开始加锁
    lk.acquire()
  10.  
  11. for _ in range(1000000):
    number += 1
    print("子线程%s运算结束后,number = %s" % (threading.current_thread().getName(), number))
  12.  
  13. # 释放锁,让别的线程也可以访问number
    lk.release()
  14.  
  15. if __name__ == '__main__':
    for i in range(2):
  16.  
  17. # 需要把锁当做参数传递给plus函数
    t = threading.Thread(target=plus, args=(lock,))
    t.start()
  18.  
  19. # 等待2秒,确保2个子线程都已经结束运算。
    time.sleep(2)
  20.  
  21. print("主线程执行完毕后,number = ", number)
  22.  
  23. # 2-信号锁 Semaphore 允许一定数量的线程同时更改数据
    def mythread(num,se):
    se.acquire()
    print("run the thread %s"%num)
  24.  
  25. time.sleep(1)
  26.  
  27. se.release()
  28.  
  29. #允许2个线程同时允许
    semaphore=threading.BoundedSemaphore(2)
  30.  
  31. #启动6个线程
    for i in range(6):
    t=threading.Thread(target=mythread,args=(i,semaphore))
    t.start()
  32.  
  33. # 3-条件锁 codintion 多个线程运行时,当一个线程执行后,在满足一定条件下,暂停执行当前线程,执行另一线程
    num=0
    con=threading.Condition()
  34.  
  35. class mythread(threading.Thread):
    def __init__(self,name,action):
    super(mythread,self).__init__()
    self.name=name
    self.action=action
  36.  
  37. def run(self):
    global num
    con.acquire()
  38.  
  39. print("开始执行%s"%self.name)
    while True:
    if self.action=="add":
    num+=1
    elif self.action=="reduce":
    num-=1
    else:
    exit(1)
    print("当前num为:",num)
  40.  
  41. time.sleep(1)
  42.  
  43. if num==5 or num==0:
    print("%s暂停执行"%self.name)
    con.notify()
    con.wait()
    print("%s开始执行"%self.name)
    con.release()
  44.  
  45. if __name__=="__main__":
    t1=mythread("线程1","add")
    t2=mythread("线程2","reduce")
    t1.start()
    t2.start()
  46.  
  47. # 4-事件锁 全局定义一个flag 当flag=False,线程调用wait(),被阻塞,不执行,当flag=True,线程不在阻塞
    # set()->flag=True clear()->flag=False wait()->等待红绿灯信号 is_set()->是否放行状态
    t=threading.Event()
  48.  
  49. def lighter():
    # 绿灯时间
    gree_time=5
  50.  
  51. # 红灯时间
    red_time=5
  52.  
  53. # 初始为红灯
    t.set()
  54.  
  55. while True:
    print("\33[32;0m 绿灯亮...\033[0m")
    time.sleep(gree_time)
    t.clear()
  56.  
  57. print("\33[32;0m 红灯亮...\033[0m")
    time.sleep(red_time)
    t.set()
  58.  
  59. def runcar(name):
    while True:
    if t.is_set():
    print("一辆[%s] 呼啸开过..." % name)
    time.sleep(1)
    else:
    print("一辆[%s]开来,看到红灯,无奈的停下了..." % name)
    t.wait()
    print("[%s] 看到绿灯亮了,瞬间飞起....." % name)
  60.  
  61. if __name__=="__main__":
    light=threading.Thread(target=lighter,)
    light.start()
  62.  
  63. for name in ['奔驰', '宝马', '奥迪']:
    car=threading.Thread(target=runcar,args=(name,))
    car.start()
  64.  
  65. #5-定时器Timer 在指定时间过后执行某个函数
    def getNum():
    rand=random.random()
    print(rand)
  66.  
  67. t=threading.Timer(4,getNum)
    t.start()

python3线程介绍02(线程锁的介绍:互斥、信号、条件、时间、定时器)的更多相关文章

  1. Java多线程系列 JUC线程池02 线程池原理解析(一)

    转载  http://www.cnblogs.com/skywang12345/p/3509960.html ; http://www.cnblogs.com/skywang12345/p/35099 ...

  2. 【C#】C#线程_混合线程的同步构造

    目录结构: contents structure [+] 一个简单的混合锁 FCL中的混合锁 ManualResetEventSlim类和SemaphoreSlim类 Monitor类和同步块 Rea ...

  3. Python3学习之路~9.2 操作系统发展史介绍、进程与线程区别、线程语法、join、守护线程

    一 操作系统发展史介绍 参考链接:http://www.cnblogs.com/alex3714/articles/5230609.html 二 进程与线程 进程: 对各种资源管理的集合 就可以称为进 ...

  4. iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信

    一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码 ...

  5. Java基础篇——线程、并发编程知识点全面介绍(面试、学习的必备索引)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10739579.html,希望大家多多支持!!! 一.线程基础 1.线程与进程 线程是指进程 ...

  6. Java并发包中线程池的种类和特点介绍

    Java并发包提供了包括原子量.并发集合.同步器.可重入锁.线程池等强大工具这里学习一下线程池的种类和特性介绍. 如果每项任务都分配一个线程,当任务特别多的时候,可能会超出系统承载能力.而且线程的创建 ...

  7. Python3 进程 线程 同步锁 线程死锁和递归锁

    进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...

  8. C#通过接口与线程通信(捕获线程状态)介绍

    C#通过接口与线程通信(捕获线程状态)介绍 摘要:本文介绍C#通过接口与线程通信(捕获线程状态),并提供简单的示例代码供参考. 提示:本文所提到的线程状态变化,并不是指线程启动.暂停.停止,而是说线程 ...

  9. concurrent.futures模块简单介绍(线程池,进程池)

    一.基类Executor Executor类是ThreadPoolExecutor 和ProcessPoolExecutor 的基类.它为我们提供了如下方法: submit(fn, *args, ** ...

  10. 内存池、进程池、线程池介绍及线程池C++实现

    本文转载于:https://blog.csdn.net/ywcpig/article/details/52557080 内存池 平常我们使用new.malloc在堆区申请一块内存,但由于每次申请的内存 ...

随机推荐

  1. Python自动化开发学习20-Django的form组件

    武沛齐老师的Django的FORM组件:http://www.cnblogs.com/wupeiqi/articles/6144178.html 转自:http://blog.51cto.com/st ...

  2. Python内置函数、作用域、闭包、递归

    1.几个可能用到的内置函数 2.函数内变量的作用域 3.内嵌函数和闭包 4.递归函数 1.常见的内置函数 常见的内置函数:    查看内置函数:        print(dir(__builtins ...

  3. A. Wrong Subtraction

    A. Wrong Subtraction time limit per test 1 second memory limit per test 256 megabytes input standard ...

  4. kafka删除主题数据和删除主题

    1.删除主题 在server.properties中增加设置,默认未开启 delete.topic.enable=true 删除主题命令 /bin/kafka-topics --delete --to ...

  5. SQL智能提示插件——SQLPrompt

    1.安装SQLPrompt,直接点击下一步即可,然后打开SQL Server 在菜单栏找到SQLPrompt选项注册该软件 2.先断开网络,然后运行注册机,将注册吗复制到序列号的地方,将两个勾选的复选 ...

  6. Java基础05-运算符

    1.赋值运算符:= 2.算术运算符: (1)一元运算符: i++;先使用后自身加1  int i=1;int b=i+1; b=1  i=2 ++i;先对自身加1后使用 int j=1;int b=+ ...

  7. 使用WindowsAPI播放PCM音频

    这一篇文章同上一篇<使用WindowsAPI获取录音音频>原理具有相似之处,不再详细介绍函数与结构体的参数 1. waveOutGetNumDevs 2. waveOutGetDevCap ...

  8. [转]JS对JSON的操作总结

    本文转自:http://www.cnblogs.com/csj222/archive/2013/04/11/3013667.html 对于前端完全是菜鸟,迫于无奈,工作中要用到JS,尤其对JSON的处 ...

  9. WSGI学习系列多种方式创建WebServer

    def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) ...

  10. jenkins自动打IOS包(转发)

    投稿文章,作者:一缕殇流化隐半边冰霜(@halfrost) 前言 众所周知,现在App的竞争已经到了用户体验为王,质量为上的白热化阶段.用户们都是很挑剔的.如果一个公司的推广团队好不容易砸了重金推广了 ...