Python中线程与互斥锁
了解之前我们先了解一下什么是多任务?
概念: 几个不同的事件在同时运行就是多任务, 这样的话, 我们有牵扯到了真的多任务, 假的多任务;
并行: 真的多任务, 通过电脑的核数来确定
并发: 假的多任务, 即cpu的快速切换
线程
1.线程之间共享全局变量;
2.主线程等待子线程结束后才结束;
3.线程之间执行顺序是无序的;
4.互斥锁以及死锁的问题.
demo 如何创建线程:
- import threading
- from time import sleep,ctime
- def sing():
- for i in range(3):
- print("正在唱歌...%d"%i)
- sleep(1)
- def dance():
- for i in range(3):
- print("正在跳舞...%d"%i)
- sleep(1)
- if __name__ == '__main__':
- print('---开始---:%s'%ctime())
- t1 = threading.Thread(target=sing)
- t2 = threading.Thread(target=dance)
- t1.start() // 注意当调用start时才真正的开始执行程序
- t2.start()
- #sleep(5) # 屏蔽此行代码,试试看,程序是否会立马结束?
- print('---结束---:%s'%ctime())
多线程之间共享全局变量
demo:
- from threading import Thread
- import time
- def work1(nums):
- nums.append(44)
- print("----in work1---",nums)
- def work2(nums):
- #延时一会,保证t1线程中的事情做完
- time.sleep(1)
- print("----in work2---",nums)
- g_nums = [11,22,33]
- t1 = Thread(target=work1, args=(g_nums,))
- t1.start()
- t2 = Thread(target=work2, args=(g_nums,))
- t2.start()
运行结果是:
----in work1--- [11, 22, 33, 44]
----in work2--- [11, 22, 33, 44]
- 互斥锁以及死锁的问题:
思考: 为什么要使用互斥锁?
线程之间共享资源, 这就导致了多个线程之间资源竞争, 导致了程序的运行.
思考: 锁的好处以及坏处?
好处: 保证了同一时间内允许一个线程的完整执行
坏处: 降低了效率, 可能会造成死锁问题
demo:
- import threading
- import time
- # 定义一个全局变量
- g_num = 0
- def test1(num):
- global g_num
- for i in range(num):
- mutex.acquire() # 上锁 注意了此时锁的代码越少越好
- g_num += 1
- mutex.release() # 解锁
- print("-----in test1 g_num=%d----" % g_num)
- def test2(num):
- global g_num
- for i in range(num):
- mutex.acquire() # 上锁
- g_num += 1
- mutex.release() # 解锁
- print("-----in test2 g_num=%d=----" % g_num)
- # 创建一个互斥锁,默认是没有上锁的
- mutex = threading.Lock()
- def main():
- t1 = threading.Thread(target=test1, args=(1000000,))
- t2 = threading.Thread(target=test2, args=(1000000,))
- t1.start()
- t2.start()
- # 等待上面的2个线程执行完毕....
- time.sleep(2)
- print("-----in main Thread g_num = %d---" % g_num)
- if __name__ == "__main__":
- main()
死锁: 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁
demo:
- import threading
- import time
- def test1(num):
- print("---test1---")
- mutex1.acquire()
- print("test1 请求 mutex1")
- time.sleep(1)
- print("test1 获得 mutex1")
- print("test1 请求 mutex2")
- mutex2.acquire()
- def test2(num):
- print("---test2---")
- print("test2 请求 mutex2")
- mutex2.acquire()
- print("test2 获得 mutex2")
- time.sleep(1)
- print("test2 请求 mutex1")
- mutex1.acquire()
- mutex1 = threading.Lock()
- mutex2 = threading.Lock()
- def main():
- t1 = threading.Thread(target=test1, args=(1000000,))
- t2 = threading.Thread(target=test2, args=(1000000,))
- t1.start()
- t2.start()
- if __name__ == "__main__":
- main()
思考: 死锁如何避免?
1. 我们可以使用time.time()来进行一个超时等待;
2.银行家算法
有需要的话可以关注我的微信公众号,会第一时间接收最新的知识。
Python中线程与互斥锁的更多相关文章
- 操作系统/应用程序、操作中的“并发”、线程和进程,python中线程和进程(GIL锁),python线程编写+锁
并发编程前言: 1.网络应用 1)爬虫 直接应用并发编程: 2)网络框架 django flask tornado 源码-并发编程 3)socketserver 源码-并发编程 2.运维领域 1)自动 ...
- 谈谈有关 Python 的GIL 和 互斥锁
转载:https://blog.csdn.net/Amberdreams/article/details/81274217 有 Python 开发经验的人也许听说过这样一句话:Python 不能充分利 ...
- Python 中线程和进程
目录 线程和进程 一. 什么是进程 / 线程 1. 引论 2. 线程 3. 进程 4. 区别 5. 使用 二. 多线程使用 1. 常用方法 2. 常用参数 3. 多线程的应用 3.1 重写线程法 3. ...
- python中线程和进程的简单了解
python中线程和进程的简单了解 一.操作系统.应用程序 1.硬件:硬盘.cpu.主板.显卡........ 2.装系统(本身也是一个软件): 系统就是一个由程序员写出来的软件,该软件用于控制计 ...
- JoinableQueue队列,线程,线程于进程的关系,使用线程,线程的特点,守护线程,线程的互斥锁,死锁问题,递归锁,信号量
1.JoinableQueue队列 JoinableQueue([maxsize]):这就像是一个Queue对象,但是队列允许项目的使用者通知生成者项目已经被成功处理.通知进程是使用共享的信号和条件变 ...
- python中线程和进程(一)
目录 进程和线程 Python中的线程 1. Thread类 2. 线程的启动 3. 线程的传参 4. 线程的属性和方法 5. daemon线程和non-daemon线程 6. join方法 7. 定 ...
- python 并发编程 多进程 互斥锁 目录
python 并发编程 多进程 互斥锁 模拟抢票 互斥锁与join区别
- Python 开启线程的2中方式,线程VS进程(守护线程、互斥锁)
知识点一: 进程:资源单位 线程:才是CPU的执行单位 进程的运行: 开一个进程就意味着开一个内存空间,存数据用,产生的数据往里面丢 线程的运行: 代码的运行过程就相当于运行了一个线程 辅助理解:一座 ...
- day34 python学习 守护进程,线程,互斥锁,信号量,生产者消费者模型,
六 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完 ...
随机推荐
- datagrid分页 从后端获取数据也很简单
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Datagrid.aspx. ...
- 创建DB2数据库联合对象
db2 1.db2 =>update dbm cfg using Federated YES 2. db2 =>db2stop force3. db2 =>db2start 4.创建 ...
- 服务器的日志一直报Packet for query is too large (7632997 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.的解决方法
服务器的日志一直报Packet for query is too large (7632997 > 4194304). You can change this value on the serv ...
- jquery报.live() is not a function的解决方法
jquery报.live() is not a function的解决方法: jquery中的live()方法在jquery1.9及以上的版本中已被废弃了,如果使用,会抛出TypeError: $(. ...
- 2018.09.24 bzoj1486: [HNOI2009]最小圈(01分数规划+spfa判负环)
传送门 答案只保留了6位小数WA了两次233. 这就是一个简单的01分数规划. 直接二分答案,根据图中有没有负环存在进行调整. 注意二分边界. 另外dfs版spfa判负环真心快很多. 代码: #inc ...
- 2018.06.29 NOIP模拟 繁星(前缀和)
繁星 [问题描述] 要过六一了,大川正在绞尽脑汁想送给小伙伴什么礼物呢.突然想起以前拍过一张夜空中的繁星的照片,这张照片已经被处理成黑白的,也就是说,每个像素只可能是两个颜色之一,白或黑.像素(x,y ...
- 36 The Benefits of Marriage 结婚的益处
36 The Benefits of Marriage 结婚的益处 ①Being sociable looks like a good way to add years to your life.Re ...
- MySQL之SQL语句零碎总结
一.MySQL中有个ifnull函数,跟Oracle的nvl类似,用法如下: select* from Ta t where ifnull(pro, 0) < 100; 解释:当pro是null ...
- 为UITextView添加通知..来检测UITextView内容的改变
self.mTextView =[[UITextView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH - 100, 28)]; se ...
- (匹配)The Accomodation of Students --HDU --2444
链接: http://acm.hdu.edu.cn/showproblem.php?pid=2444 http://acm.hust.edu.cn/vjudge/contest/view.action ...