#!/usr/bin/env python
# -*- coding:utf-8 -*- import threading
import time
import random # 1-互斥锁 Lock 同一时刻只能有1个线程运行,需要将锁传给任务函数
number = 0
lock = threading.Lock() def plus(lk):
global number #开始加锁
lk.acquire() for _ in range(1000000):
number += 1
print("子线程%s运算结束后,number = %s" % (threading.current_thread().getName(), number)) # 释放锁,让别的线程也可以访问number
lk.release() if __name__ == '__main__':
for i in range(2): # 需要把锁当做参数传递给plus函数
t = threading.Thread(target=plus, args=(lock,))
t.start() # 等待2秒,确保2个子线程都已经结束运算。
time.sleep(2) print("主线程执行完毕后,number = ", number) # 2-信号锁 Semaphore 允许一定数量的线程同时更改数据
def mythread(num,se):
se.acquire()
print("run the thread %s"%num) time.sleep(1) se.release() #允许2个线程同时允许
semaphore=threading.BoundedSemaphore(2) #启动6个线程
for i in range(6):
t=threading.Thread(target=mythread,args=(i,semaphore))
t.start() # 3-条件锁 codintion 多个线程运行时,当一个线程执行后,在满足一定条件下,暂停执行当前线程,执行另一线程
num=0
con=threading.Condition() class mythread(threading.Thread):
def __init__(self,name,action):
super(mythread,self).__init__()
self.name=name
self.action=action def run(self):
global num
con.acquire() print("开始执行%s"%self.name)
while True:
if self.action=="add":
num+=1
elif self.action=="reduce":
num-=1
else:
exit(1)
print("当前num为:",num) time.sleep(1) if num==5 or num==0:
print("%s暂停执行"%self.name)
con.notify()
con.wait()
print("%s开始执行"%self.name)
con.release() if __name__=="__main__":
t1=mythread("线程1","add")
t2=mythread("线程2","reduce")
t1.start()
t2.start() # 4-事件锁 全局定义一个flag 当flag=False,线程调用wait(),被阻塞,不执行,当flag=True,线程不在阻塞
# set()->flag=True clear()->flag=False wait()->等待红绿灯信号 is_set()->是否放行状态
t=threading.Event() def lighter():
# 绿灯时间
gree_time=5 # 红灯时间
red_time=5 # 初始为红灯
t.set() while True:
print("\33[32;0m 绿灯亮...\033[0m")
time.sleep(gree_time)
t.clear() print("\33[32;0m 红灯亮...\033[0m")
time.sleep(red_time)
t.set() def runcar(name):
while True:
if t.is_set():
print("一辆[%s] 呼啸开过..." % name)
time.sleep(1)
else:
print("一辆[%s]开来,看到红灯,无奈的停下了..." % name)
t.wait()
print("[%s] 看到绿灯亮了,瞬间飞起....." % name) if __name__=="__main__":
light=threading.Thread(target=lighter,)
light.start() for name in ['奔驰', '宝马', '奥迪']:
car=threading.Thread(target=runcar,args=(name,))
car.start() #5-定时器Timer 在指定时间过后执行某个函数
def getNum():
rand=random.random()
print(rand) 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. ubuntu14.04 apt-get install找不到软件,更换源解决

    安装14.04后,有时使用apt-get命令安装程序,会提示找不到程序,这是因为软件源不正确,网上说的换163的.中科大的.阿里的等等,我在更新源的时候都会出错,一般是报404错误,网上也没找到好的办 ...

  2. [Groovy]Parse properties file in Groovy

    def props = new Properties() new File("foo.properties").withInputStream { s -> props.lo ...

  3. ubuntu 搭建django 环境

    ubuntu 默认安装了 python2.7 . 安装django apt install python-django: 安装mysql apt install mysql-server*  *代表版 ...

  4. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_基元类型(一)

    [概念] 编译器直接支持的数据类型 [C#基元类型与对应的 FCL 类型] C#基元类型 FCL 类型 说明 sbyte System.Sbyte 有符号8位值 byte System.Byte 无符 ...

  5. connecting-to-github-with-ssh

    https://help.github.com/articles/connecting-to-github-with-ssh/ 创建ssh密钥后,从github clone仓库到本地出现permiss ...

  6. MSF利用ms17-010漏洞过程记录

    1.使用网上以上一个监测工具,扫描出存在ms17-010的主机地址 2.在kali中使用MSF进行检测,存在mf17-010漏洞 msf > use auxiliary/scanner/smb/ ...

  7. my16_sql_thread执行慢导致主从延迟高的一个情景

    现象:从库延迟高,查看slave status发现sql_thread执行语句的速度比主库慢,这样的延迟会一直高下去,下面是排查的一些过程1. 检查了从库的配置,磁盘的写入速度的确没有主库高2. io ...

  8. 普通用户不能使用sudo命令的解决办法

    普通用户不能使用sudo命令的解决办法 https://www.cnblogs.com/fasthorse/p/5949946.html 1. 切换到root用户下:su – root 2. 给/et ...

  9. vue 的watch用法

    参考转自https://www.imooc.com/article/details/id/28187 类型:{ [key: string]: string | Function | Object | ...

  10. idea进行断点快捷键

    快捷键 功能描述 F8 单步调试,不进入函数内部 F7 单步调试,进入函数内部 Shift+F7 选择要进入的函数 Shift+F8 跳出函数 Alt+F9 运行到断点 Alt+F8 执行表达式查看结 ...