多进程、多线程操作
线程和进程对比:
一个进程可以有多个线程,但是至少有一个主线程
一个线程只能属于一个进程
一个进程中多个线程,可以共享进程中提供的数据
CPU运算分配给线程,CPU上执行运算的是线程
线程时最小的运行单元,晋城市最小的资源管理单元
串行:按照执行步骤顺序执行
并行:同时执行多个任务
并发:同时收到多个任务,同时执行多个任务。但是具体到某一刻,只是在执行一个任务。
(1) _thread多线程操作,较为底层
通过_thread函数启动两个线程完成多线程并发操作
导入模块
Import _thread
启动进程
_thread.start_new_thread(函数,())
获取线程编号
_thread.get_ident()
注意:让子线程执行结束,需要让主线程休眠
(2) threading多线程操作,使用较为普遍
导入模块
Import threading
线程启动
t1 = threading.Thread(name=" ",target=函数名)
获取当前存货的所有进程
a) threading.active_count()
b) t = threading.activeCount()
print(t)
获取当前线程对象
threading.current_thread()
获取当前线程对象名称
threading.current_thread().getName()
获取当前线程对象编号
threading.get_ident()
获取主线程
threading.main_thread() #获取线程名称与编号操作与获取当前线程一样
(3) 线程锁操作[互斥锁|可重用锁]
a) 互斥锁
定义互斥锁对象
lock = threading.Lock()
加锁
lock.acquire() #常用if进行判断即:if lock.acquire():
互斥锁的主要作用是,当一个进程在对数据进行操作时,不让其他进程造成干扰。加上互斥锁后,当一个进程对数据进行操作时,其他进程不能再操作数据,只能等上一个进程操作完毕后,下一个进程才能进行操作。
解锁
lock.release()
注意:在进行加锁后要记得解锁,否则程序可能死锁,不再继续运行
死锁:可·······尝试·使用可重用锁
b) 可重用锁
i. 使用时只操作一个
(4)线程状态-daemon
daemon的主要作用是守护线程。
在Python中daemon默认为False,当主进程结束时,子线程继续执行。如果想让主线程结束时子线程跟着结束,则需要将daemon改为True
用法:-》进程名.daemon = False/True
(5)join独占属性:让当前线程独占CPU时间片,直到当前线 程运行结束/超时
进程名.join()
(6)两个线程之间的相互通信
#线程通信-事件对象
event = threading.Event()
event.set()添加标记
event.wait()线程等待
event.clear()清除标记
线程通信-条件对象
定义条件对象
con = threading.Condition()
con.acquire()上锁
con.release()解锁
con.wait()等待
con.notify()唤醒
公共数据的处理:生产者、消费者问题
公共的数据[篮子]
生产者:蒸包子-> 放到篮子中:并且告诉[唤醒]所有消费者可以吃了
如果篮子满了,所有 生产者 等待
消费者:吃包子-> 从篮子中获取数据,并且告诉[唤醒]所有生产者继续蒸包子
如果篮子空了,所有 消费者 等待
#线程通信-队列
创建一个队列,存储数据
basket = queue.Queue(10)
put(data [, timeout=None])
向队列中添加数据,如果队列已满~一直等待[到超时]
get([timeout=None])
从队列中获取数据,如果队列已空~一直等待[到超时]
特性:线程安全!
网友评论