非守护线程:若一个进程有多个线程,程序不会再主线程结束后就结束,而是在所有线程结束之后才结束
守护线程:主线程结束,子线程就结束(主线程结束程序就结束)
线程对象.setDaemon(True)
一般发生在多个线程对同一个数据进行操作的时候。在一个数据被一个线程操作后却还未更新数据时数据被另一个线程操作就会造成数据冲突。
解决数据冲突:在数据被一个线程操作时将数据锁住,等该线程返回更新数据后再解锁数据让数据再次可以被线程操作
Lock
锁类,重量级锁(上锁和解锁都需要手动进行)
创建锁对象
锁对象 = Lock()
上锁
锁对象.acquire()
上锁代码
解锁
锁对象.release()
RLock
创建锁对象
锁对象 = RLock()
上锁
with 锁对象:
上锁代码
需要其他进程的时候就创建进程类Process的对象
不能直接在一个进程中修改另一个进程的数据
导入:from multiprocessing import Process
支持多进程间通信的Queue
导入:from multiprocessing import Process, Queue
导入:
from multiprocessing import Pool
创建进程池对象
进程池对象 = Pool(进程数)
添加任务和执行任务(添加后会自动执行)
1)同时添加多个任务,返回值就是任务对应函数的返回值
进程池对象.map()
2)添加单个任务,返回值就是任务对应函数的返回值
关闭进程池(停止往进程池中添加任务;进程池在未关闭时可以随时添加新的任务)
进程池对象.close()
等待进程池中的任务都结束
进程池对象.join()