进程和线程
一、引言
1 | 1. 程序:是完成特定任务的一系列的指令(代码)的集合,或者是打包好的二进制的可执行的文件.(程序本身是一个静态实体) |
1 | # 并行: |
二、发展背景
1 | 1. 几乎所有的现代操作系统都是多任务的操作系统. |
三、多任务
1 | 1. 一种是启动多个进程,每个进程有一个主线程,但是多个进程可以同时执行多个任务 |
四、多线程
1 | 单线程和多线程: |
1 | def music(name, loop): |
多线程模块
1 | 1. Python2: thread,threading |
1 | # threading.Thread类 |
创建多线程的方式
- 使用Thread类直接创建线程(子线程)
1 | import threading |
- 继承Thread类,并实现run方法
1 | import threading |
Thread类中的方法
1 | 1. getName() |
1 | 2. setName(name) |
1 | 3. ident: |
1 | 4. is_alive(): |
1 | 5. join([timeout]) |
1 | 6. setDaemon(bool) |
五、进程和线程的状态
1 | # 进程的三个状态: |
1 | # 线程的五个状态: |
六、GIL锁
1 | GIL:全局解释锁 Global Interpreter Lock |
七、线程安全
1 | 1. 线程同步: |
1 | # 这里会发生数据脏读问题 |
1 | # 加锁之后就是线程同步 one by one |
1 | Lock对象在一个线程中对同一个原子操作,只有一次机会使用acquire来给线程加锁,如果出现了多次,则就会出现死锁状态,无法正常使用 |
1 | def fun(ch): |
1 | 解决死锁问题: |
八、多进程模块
1、多进程模块
1 | # multiprocessing 多进程模块 |
1 | import multiprocessing |
2、进程之间数据不共享
1 | import multiprocessing, time |
3、进程锁
1 | 1. 进程之间的数据是不共享的,但是共享同一套文件系统,所以访问同一个文件时可能会有问题 |
1 | import time |
4、进程池
1 | 1. 进程池:在进程任务特殊多的情况下,手动挨个来管理进程比较麻烦,可以通过设置进程池来进程管理 |
1 | import multiprocessing, time |
常用方法:
1 | 1. apply() |
九、进程间通信
1 | 1. 操作系统会为每一个进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的 |
1、队列
队列并不是数据的共享,而是数据的传递
1 | import multiprocessing, time |
2、管道
1 | 1. Pipe(duplex=True) |
1 | import multiprocessing, time |
十、生产者与消费者
1 | 生产者与消费者模式:生产者与消费不直接通讯,而是通过队列进行通讯,队列是一个缓冲区,生产者产生了数据丢给队列(缓冲区),消费者从队列取数据 |
1 | # 消费者 |
补充:threadlocal
1 | # 每一个线程会创建一个副本,访问的是自己内容的局部变量 |