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.线程可不需 ...
随机推荐
- 翻译 异步I/O不会创建新的线程
异步I/O不会创建新的线程 本文翻译自 Stephen Cleary 的 [There is No Thread] 原文地址 https://blog.stephencleary.com/2013/1 ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(四):发布与回滚
写在前面 我们以前windows跑.net Framework程序的时候,发布,自己乖乖的替换程序:备份,也是自己一个一个的重命名备份:回滚,发布遇到问题的回滚更是不用说了:运维很是怕我们 这些用wi ...
- 免费报名 | 腾讯云自研数据库CynosDB交流会
本文由云+社区发表 作者:技术沙龙 All in 云+时代,数据库的高可用性.按需付费.按需扩展等属性解放了大批开发者.腾讯发布的自研数据库CynosDB作为国内首款同时兼容MySQL和PG的云原生数 ...
- Spring Boot 系列总目录
一.Spring Boot 系列诞生原因 上学那会主要学的是 Java 和 .Net 两种语言,当时对于语言分类这事儿没什么概念,恰好在2009年毕业那会阴差阳错的先找到了 .Net 的工作,此后就开 ...
- 第31章 日志 - Identity Server 4 中文文档(v1.0.0)
IdentityServer使用ASP.NET Core提供的标准日志记录工具.Microsoft文档有一个很好的介绍和内置日志记录提供程序的描述. 我们大致遵循Microsoft使用日志级别的指导原 ...
- [Go] golang缓冲通道实现管理一组goroutine工作
通道1.当一个资源需要在goroutine之间共享时,通道在goroutine之间架起了一个管道2.无缓冲通道和有缓冲通道,make的第二个参数就是缓冲区大小3.无缓冲通道需要发送和接收都准备好,否则 ...
- 日志收集ELK+kafka相关博客
SpringBoot+kafka+ELK分布式日志收集 使用 logstash + kafka + elasticsearch 实现日志监控 Kibana 安装 与 汉化 windows系统安装运行f ...
- OO_BLOG1_简单表达式求导问题总结
作业1-1 包含简单幂函数的多项式导函数的求解 I. 基于度量的程序结构分析 1)程序结构与基本度量统计图 2)分析 本人的第一次作业的程序实现逻辑十分简单,但是OOP的色彩并不强烈,程序耦合度过 ...
- 深入理解 JavaScript 执行上下文和执行栈
前言 如果你是一名 JavaScript 开发者,或者想要成为一名 JavaScript 开发者,那么你必须知道 JavaScript 程序内部的执行机制.执行上下文和执行栈是 JavaScript ...
- #WEB安全基础 : HTML/CSS | 0x10实现交互_表单
先看看表单如何工作吧 请求 响应 简要工作流程: 浏览器加载页面 用户输入数据 用户提交表单 服务器响应 概念都清楚了,我们来写表单吧 只有一个html文件 这是显示 你可以向空白框框 ...