一. 线程与进程的区别
1. 进程间相互独立,统一进程下的线程共享进程的资源
2. 进程间通信IPC, 线程间可以直接读写进程的内容来进行通信
3. 线程切换快
4. 进程不是可执行的实体,真正执行程序的是线程,进程是线程的容器
二. 线程的特点
共享进程资源 可并发执行
三. threading模块
1. 线程的创建
1)from threading import Thread
t = Thread(target=函数,args=(),kwargs={})
t.start()
2)继承Thread类
class MyThread(Thread):
def run(self):
pass
t = MyThread()
t.start()
在父进程下开启的多个线程,每个线程都跟父进程的pid一样
2. threading的一些方法
threading.current_thread() # 返回当前线程对象
threading.enumerate() # 返回一个包含正在运行的线程的列表.
threading.current_thread().getName() # 得到当前线程的名称
threading.current_thread().ident # 得到当前线程的线程号
3. 守护线程(t.deamon = True)
1)对进程而言,守护进程是指父进程的代码执行完,守护进程随之结束,
但父进程没有结束,要等待所有进程接收回收后才结束
2)对线程而言,父线程是等非守护进程全部执行完才结束,
如果守护线程在这段时间内可以执行完,就执行
若不能,则随着父线程的代码结束
4. GIL锁
GIL是解释器级别的,保护的就是解释器级别的数据,所有线程抢的是GIL锁,或者说所有线程抢的是执行权限
5. Lock
r = Lock()
r.acquire()
加锁的内容
r.release()
死锁:
是指两个或两个以上的进程或线程在执行过程中,
因争夺资源而造成的一种互相等待的现象
递归锁:
6. Event 事件
isSet() # 返回时什么状态
wait() # 当False的时候阻塞住
set() # 将event的状态设成True
clear() # 将event的状态设成False
7. queue 队列
import queue
1) 先进先出
q = queue.Queue()
q.put()
q.get()
2) 先进后出
q = queue.LifoQueue()
3) 优先级队列
q = PriorityQueue()
q.put(元组) # 元组第一个通常放数字(优先级),越小优先级越高
若优先级相同,比较后面的ASCII码,小的先出来
8. 进程池 concurrent.futures 模块
ThreadPoolExecutor 线程池
ProcessPoolExecutor 进程池
submit(func,参数) 异步提交任务
map(func, *iterables, timeout=None, chunksize=1) 取代for循环submit的操作
shutdown(wait=True) 相当于进程池的pool.close()+pool.join()操作
result() 取结果
add_done_callback() 回调函数