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.线程可不需 ...
随机推荐
- Docker公共&本地镜像仓库(七)--技术流ken
分发镜像 我们已经会构建自己的镜像了,那么如果在多个docker主机上使用镜像那?有如下的几种可用的方法: 用相同的Dockerfile在其他host上构建镜像 将镜像上传到公共registry(比如 ...
- 《Web安全深度剖析》
书名 <Web安全深度剖析> 图片 时间 2018-11月 总结 算是我安全的启蒙书 前五章都是工具 看完差不多算个脚本小子 后面的实战感觉很空洞没什么实战
- [PHP]MySQL的wait_timeout与pdo对象
1.查看和设置mysql的wait_timeout的值 SHOW GLOBAL VARIABLES LIKE '%timeout%'; 设置wait_timeout的值 SET GLOBAL wait ...
- 如何在idea中调试spring bean
步骤 在 Run/Debug Confihuration 中,增加 Application -> local,除去其余配置外,在 Program arguments 一栏添加以下字段:javac ...
- 【开源】SpringBoot&Netty实现仿微信网页版项目更新
阅读本文约“2.3分钟” 项目更新啦!V1.3.0 还记得那个聊天室的小项目吗? SpringBoot 加 Netty 实现聊天室 没错,这次已经完整进行了版本的替换,酥酥聊天室! 基于原项目的改动, ...
- java的常用数据结构
Java中有几种常用的数据结构,主要分为Collection和map两个主要接口(接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类. --- 1. Collect ...
- C#设计模式之二十二备忘录模式(Memento Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第十个模式,该模式是[备忘录模式],英文名称是:Memento Pattern.按老规矩,先从名称上来看看这个模式,个人的最初理解就是对某个对象的状态进行保 ...
- 微信小程序picker的坑
js文件: Companyarr: [{ id: '公司id1', companyname: "公司1的名字" }, { id: '公司id2', companyname: &qu ...
- java servlet的执行流程
1.先附上代码如下 Servlet1.java public class Servlet1 implements Servlet { @Override public void init(Servle ...
- JS 事件绑定,监听,委托(代理)
我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代理)等.这些名词是什么意思呢,有什么作用呢? 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元 ...