14.高级语法(6)
其他
2020-01-11 21:54:49
阅读次数: 0
多线程 vs 多进程
- 进程:每个进程有自己的完全独立的运行环境,多进程共享数据
- 线程:
- 一个进程有多个线程
- 一个进程的多个线程之间共享数据和上下文环境
- 共享互斥问题
- 全局解释性
- Python代码的执行是由python虚拟机进行控制
- 在主循环中只能有一个控制线程在之执行
- thread包
- thread.start_new_thread():启动一个线程
- threading
- t = threading.Thread(target=xxx,args=(xxx,)):生成实例
- t.start():启动多线程
- t.join():等待多线程执行完成
- 守护线程
- 如果在程序中将子线程设置成守护线程,则子线程会在主线程结束的时候自动退出
- 一般认为守护线程不重要或者不允许离开主线程独立运行
- 设置守护线程:t.setDaemon(True),必须在start之前设置,否则无效
- 线程常用属性
- threading.currentThread :返回当前线程变量
- threading.enumerate:返回一个包含当前正在运行线程的list
- threading.activeCount:返回正在运行的线程数量
- t.setName:给线程设置名字
- t.getNamer:获取线程名字
- 继承threading.Thread
- 需要重写run方法
- 可以不写__ init _ ,但是一旦写了就必须执行super(). __ init __ ()
共享变量
- 多个线程同时访问一个变量的时候,产生问题
- 解决方法:锁、信号灯
锁
- 一个标志,表示一个线程正在占用一些资源
- 使用方法:
- lock = threading.Lock():生成锁实例
- 上锁:lock.acquire()
- 使用资源:
- 解锁:lock.release()
线程安全问题
- 如果一个资源对于多线程不用加锁也不会有安全问题,则称为线程安全问题
- 线程不安全变量类型:list、set、dict
- 线程安全变量类型:queue
生产者消费者问题
死锁问题
锁的等待时间问题
Semaphore
threading.Timer
可重入锁
- t = threading.RLock()
- 同一个锁,可以被一个线程多次申请
- 主要解决递归调用的时候重复申请锁的情况
线程替代方案
- subprocess
- multiprocessing
- 使用threading接口派生,使用子进程
- 允许为多核或者多CPU派生进程,接口和threading非常相似
- concurren.futures
多进程
进程的创建
- 直接生成Process实例对象
- 派生multiprocessing.Process的子类
- os.pid查看子进程的ID
- os.ppid查看父进程的ID
- 生产者消费者模型
- q = multiprocessing.JoinableQueue()
发布了247 篇原创文章 ·
获赞 23 ·
访问量 9万+
转载自blog.csdn.net/LiyangBai/article/details/102999300