26 python 初学(线程、同步锁、死锁和递归锁)
参考博客: www.cnblogs.com/yuanchenqi/articles/5733873.html
并发:一段时间内做一些事情
并行:同时做多件事情
线程是操作系统能够进行运算调度的基本单位,一个线程就是一个指令集
IO 密集型任务或函数 计算密集型任务函数
t1 = threading.Thread( target=foo, args=( , ))
t1.start()
# _author: lily
# _date: 2019/1/29 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) if __name__ == '__main__':
t1 = MyThread(1)
t2 = MyThread(2)
t1.start()
t2.start()
# _author: lily
# _date: 2019/1/28 import threading
import time def music(func):
for i in range(2):
print('listening to music %s.%s' % (func, time.ctime()))
time.sleep(1)
print('end listening %s' % time.ctime()) def move(func):
for i in range(2):
print('watching at the %s.%s' % (func, time.ctime()))
time.sleep(5)
print('end watching %s' % time.ctime()) threads = []
t1 = threading.Thread(target=music, args=('七里香', ))
threads.append(t1)
t2 = threading.Thread(target=move, args=('阿甘正传', ))
threads.append(t2)
if __name__ == '__main__':
for t in threads:
t.start()
print('all over %s' % time.ctime())
GIL: 全局解释器锁。 对于一个进程,在同一时刻,python解释器中只允许一个线程运行。
结论:在 python里,如果是 io 密集型,可以用多线程
计算密集型,改 C。
守护线程: t.setDaemon(True) 当主线程结束之后就认为程序执行完毕,不会等待 t 线程执行完毕。
得到当前线程: print(threading.current_thread())
得到当前活着的线程: print(threading.active_count())
同步锁:
原因:1. 线程共享同一资源,且进行 IO 阻塞时,对资源的操作容易被覆盖
- 使用 join 就会造成船串行,失去了多线程的意义
使用:r = threading.Lock()
同步锁与GIL关系:
没有GIL ,使用同步锁,可以达到一样得效果。
# _author: lily
# _date: 2019/1/29 import time
import threading num = 100 def add():
global num
# num -= 1 r.acquire()
temp = num
# time.sleep(0.0000001)
print('ok')
num = temp - 1
r.release() thread_list = [] r = threading.Lock()
for i in range(100):
t = threading.Thread(target=add)
t.start()
thread_list.append(t) for thd in thread_list:
thd.join() print('final num: ', num)
线程死锁和递归锁:
lock = threading.Lock()
lock = threading.RLock()
# _author: lily
# _date: 2019/1/29
import threading
import time class MyThread(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name def run(self):
self.do_a()
self.do_b() def do_a(self):
# lock_a.acquire()
my_lock.acquire()
print('do_a: thread %s get lock A' % self.name)
time.sleep(3)
my_lock.acquire()
print('do_a: thread %s get lock B' % self.name)
# lock_b.release()
# lock_a.release()
my_lock.release()
my_lock.release() def do_b(self):
# lock_b.acquire()
my_lock.acquire()
print('do_b: thread %s get lock B' % self.name)
time.sleep(2)
# lock_a.acquire()
my_lock.acquire()
print('do_b: thread %s get lock A' % self.name)
# lock_a.release()
# lock_b.release()
my_lock.release()
my_lock.release() # lock_a = threading.Lock()
# lock_b = threading.Lock()
my_lock = threading.RLock()
thread_list = [] for i in range(5):
t = MyThread(i)
thread_list.append(t)
t.start() for t in thread_list:
t.join()
26 python 初学(线程、同步锁、死锁和递归锁)的更多相关文章
- Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures
参考博客: https://www.cnblogs.com/xiao987334176/p/9046028.html 线程简述 什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线 ...
- python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)
昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...
- python并发编程之线程(二):死锁和递归锁&信号量&定时器&线程queue&事件evevt
一 死锁现象与递归锁 进程也有死锁与递归锁,在进程那里忘记说了,放到这里一切说了额 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将 ...
- 同步锁 死锁与递归锁 信号量 线程queue event事件
二个需要注意的点: 1 线程抢的是GIL锁,GIL锁相当于执行权限,拿到执行权限后才能拿到互斥锁Lock,其他线程也可以抢到GIL,但如果发现Lock任然没有被释放则阻塞,即便是拿到执行权限GIL也要 ...
- 10 并发编程-(线程)-GIL全局解释器锁&死锁与递归锁
一.GIL全局解释器锁 1.引子 在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势 首先需要明确的一点是GIL并不是Python的特性,它是在实现Pyt ...
- GIL全局解释器锁-死锁与递归锁-信号量-event事件
一.全局解释器锁GIL: 官方的解释:掌握概念为主 """ In CPython, the global interpreter lock, or GIL, is a m ...
- Python之网路编程之死锁,递归锁,信号量,Event事件,线程Queue
一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 它们都将无法推进下去.此时称系统处于死锁状态或系统 ...
- python并发编程之线程(创建线程,锁(死锁现象,递归锁),GIL锁)
什么是线程 进程:资源分配单位 线程:cpu执行单位(实体),每一个py文件中就是一个进程,一个进程中至少有一个线程 线程的两种创建方式: 一 from threading import Thread ...
- day 33 什么是线程? 两种创建方式. 守护线程. 锁. 死锁现象. 递归锁. GIL锁
一.线程 1.进程:资源的分配单位 线程:cpu执行单位(实体) 2.线程的创建和销毁开销特别小 3.线程之间资源共享,共享的是同一个进程中的资源 4.线程之间不是隔离的 5.线程可不需 ...
随机推荐
- VSCode搭建Vue项目
在vscode上搭建一个vue项目---初学总结. 1.假设Vscode.nodejs等已经安装好了. 2.全局安装vue-cli,vue-cli可以帮助我们快速构建Vue项目. 安装命令: npm ...
- Linux设备驱动之IIO子系统——IIO框架及IIO数据结构
由于需要对ADC进行驱动设计,因此学习了一下Linux驱动的IIO子系统.本文翻译自<Linux Device Drivers Development >--John Madieu,本人水 ...
- 【Java基础】【14正则表达式&常用工具类】
14.01_常见对象(正则表达式的概述和简单使用) A:正则表达式 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用. 作用:比如注册邮箱,邮箱有 ...
- ldap配置系列二:jenkins集成ldap
ldap配置系列二:jenkins集成ldap jenkins简介 jenkins是一个独立的.开放源码的自动化服务器,它可以用于自动化与构建.测试.交付或部署软件相关的各种任务. jenkins官方 ...
- springboot情操陶冶-web配置(七)
参数校验通常是OpenApi必做的操作,其会对不合法的输入做统一的校验以防止恶意的请求.本文则对参数校验这方面作下简单的分析 spring.factories 读者应该对此文件加以深刻的印象,很多sp ...
- SSH隧道:端口转发功能详解
SSH系列文章: SSH基础:SSH和SSH服务 SSH转发代理:ssh-agent用法详解 SSH隧道:端口转发功能详解 1.1 ssh安全隧道(一):本地端口转发 如下图,假如host3和host ...
- ElasticSearch入门点滴
这是Elasticsearch-6.2.4 版本系列的第一篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 ...
- Linux CentOS设置定时重启:crontab
上一篇介绍了 开机自启动chkconfig命令 https://www.cnblogs.com/prefectjava/p/9399470.html 本篇介绍 crontab 设置定时任务,并且把 ...
- 多线程(5)async&await
.net 4.0的Task已经让我们可以非常简单地使用多线程,并且可以有返回值,也可以支持线程的取消等操作,可谓已经很强大了.但.net 4.5为我们带来了async&await,使得实现多线 ...
- 转载:Linux服务器Cache占用过多内存导致系统内存不足最终java应用程序崩溃解决方案
原文链接: https://blog.csdn.net/u014740338/article/details/66975550 问题描述 Linux内存使用量超过阈值,使得Java应用程序无可用内存, ...