Python3之多线程
来源:互联网 发布:韩国人眼中的中国知乎 编辑:程序博客网 时间:2024/05/29 16:09
概念
线程是CPU执行调度的最小单位,进程只是开辟内存空间,整合内存资源
线程与进程区别
线程:
线程可以共享进程内的资源
线程的创建比进程的创建内存要小
进程:
各个进程间的内存空间是相互隔离的,进程间的相互通信资源共享依赖IPC(interprocess communication)机制
守护线程与守护进程
守护进程代码演示
import timefrom multiprocessing import Processdef deal_task(): time.sleep(3) print('coping with the task')def cope_task(): time.sleep(5) print('task is done')if __name__ == '__main__': p1 = Process(target=deal_task, ) p2 = Process(target=cope_task, ) p1.daemon = True p1.start() p2.start() print('主进程')
代码讲解
子进程p1调用daemon将子进程设置为守护进程,当主进程的代码运行完毕,主进程的所有功能运行完毕,这时守护进程会被灭掉,相当于主子死了,随从必须跟着就去了,但是主进程必须要等非守护进程全部运行完毕后,给非守护进程把资源回收掉之后才能结束守护线程代码演示
import timefrom threading import Threaddef deal_task(): time.sleep(3) print('coping with the task')def cope_task(): time.sleep(5) print('task is done')if __name__ == '__main__': t1 = Thread(target=deal_task, ) t2 = Thread(target=cope_task, ) t1.daemon = True t1.start() t2.start() print('主线程')
代码讲解
守护进程和守护进程有所不同,主线程其实是代表进程,主线程产生进程产生,主进程销毁代表进程销毁,基于这点认识:当t1被设置为守护线程时,主线程可能已经提前结束,但是在代码执行过程中的其他线程会陆续创建,这时主线程不能结束,因为所有的线程都是在执行同一个进程的任务,进程的任务没有执行完毕,进程先结束了这显然不符合常理,所以主线程要等其他线程都结束了主线程才能结束,这样主线程结束了代表进程结束,而主线程结束了,守护线程也就跟着结束了。线程的GIL(全局解释器锁)
GIL只有从CPython中有,所以不是Python的特性
GIL作用
控制解释器的执行权限
保护系统级别的数据
GIL与互斥锁同在的情况下代码运行分析
代码演示
import timefrom threading import Thread,Locknum = 100def deal_num(): mutex.acquire() global num # print(num) # time.sleep(0.1) # num -= 1 # print(num) ############## temp = num time.sleep(0.5) num = temp - 1 ############## mutex.release()if __name__ == '__main__': mutex = Lock() t_l = [] for t in range(100): t = Thread(target=deal_num, ) t_l.append(t) t.start() for t in t_l: t.join() print('主线程', num)
代码讲解
GIL被加在进程上,所以每次程序的执行都会产生很多线程,这些线程要获取GIL才能获取解释器执行权限,进行使代码继续执行。这样保证同一时刻只有一个线程在运行,当一个线程拿到GIL时,mutex锁就会被会拿到,那么代码会继续执行,直接遇到sleep(0.5),I/O操作GIL锁被释放,其它线程会争夺GIL锁权限,但是某进程争夺到GIL锁权限时,发现内部的mutex锁还没被释放,只好继续等着,这时GIL锁再次被释放,其余线程再次争夺GIL,直到mutex锁被释放,mutex锁会被争夺,直到一个线程抢到mutex权限,循环往复~
你们明白了吗?哈哈,我这都不知道自己写了些什么!!!仰天长啸~阅读全文
0 0
- python3语法之多线程
- Python3之多线程
- python3之多线程和tkinter gui
- Python3之多线程GIL、同步锁、信号量、死锁与递归锁、线程Queue、Event、定时器
- python3 语法之多进程
- android线程之多线程
- Python3之多进程join、daemon
- python3 线程
- GroboUtils之多线程测试
- Java学习之多线程
- java基础教程之多线程
- ecl之多线程
- Qt之多线程(一)
- Qt之多线程(二)
- 黑马程序员之多线程
- iOS 之多线程 NSThread
- delphi之多线程编程
- MFC之多线程创建
- 【算法】判断是否是二叉搜索树的后序遍历序列
- Spring MVC中的DispatcherServlet作用
- 初探Architecture Components之ViewModel
- JAVA WEB servlet过滤器
- Objective
- Python3之多线程
- 微信小程序 navigate页面跳转问题解决方案
- java定义数组的三种类型
- [Spring-Boot] Spring MyBatis 多数据源的配置和管理
- js图片解析工具类
- 如何操作iframe父页面中的元素、方法、变量
- 便利蜂 Java 开发岗一面面经
- 槽边往事
- 普元 EOS Platform 7.6 如何修改nui.confirm()提示框按钮的显示名称