Python学习——多线程操作

2018-08-23  本文已影响17人  阿猫阿狗py

多进程、多线程操作

线程和进程对比:

一个进程可以有多个线程,但是至少有一个主线程

一个线程只能属于一个进程

一个进程中多个线程,可以共享进程中提供的数据

CPU运算分配给线程,CPU上执行运算的是线程

线程时最小的运行单元,晋城市最小的资源管理单元

串行:按照执行步骤顺序执行

image.png

并行:同时执行多个任务

image.png

并发:同时收到多个任务,同时执行多个任务。但是具体到某一刻,只是在执行一个任务。

image.png

(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()清除标记

image.png

线程通信­-条件对象

定义条件对象

con = threading.Condition()

con.acquire()上锁

con.release()解锁

con.wait()等待

con.notify()唤醒

公共数据的处理:生产者、消费者问题

公共的数据[篮子]

生产者:蒸包子-> 放到篮子中:并且告诉[唤醒]所有消费者可以吃了

如果篮子满了,所有 生产者 等待

消费者:吃包子-> 从篮子中获取数据,并且告诉[唤醒]所有生产者继续蒸包子

如果篮子空了,所有 消费者 等待

#线程通信-队列

创建一个队列,存储数据

basket = queue.Queue(10)

put(data [, timeout=None])

向队列中添加数据,如果队列已满~一直等待[到超时]

get([timeout=None])

从队列中获取数据,如果队列已空~一直等待[到超时]

特性:线程安全!

上一篇下一篇

猜你喜欢

热点阅读