Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。
1.1、threading模块
threading模块建立在_thread模块之上。thread模块以低级=原始的方式来处理和控制线程,而threading模块
通过对thread进行二次封装,提供了更方便的api来处理线程。
简单的线程实例:
创建了20个“前台”线程,然后控制器就交给了CPU,CPU根据指定算法进行调度,分片执行指令
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 """ 4 创建一个简单的threading线程实例 5 """ 6 import threading 7 import time 8 9 def to_worker(num): 10 """ 11 线程方法 12 :param num: 13 :return: 14 """ 15 time.sleep(1) 16 print("The num is %s" % num) 17 return 18 19 for i in range(5): 20 t = threading.Thread(target=to_worker, args=(i, )) 21 t.start() #激活线程
代码执行结果:
1.2、创建线程的构造方法
t = threading.Thread(group = None, target = None, name = Nome, args = 0, kwargs = {})
注释说明:
group --线程组
target --要执行的方法
name --线程名
args/kwargs -要传入方法的参数
Thread类提供了以下方法:
1、t.start() --激活线程
2、t.getName() --获取线程的名称
3、t.setName() --设置线程的名称
4、t.name() --获取或设置线程的名称
5、t.is_alive() --判断线程是否为激活状态
6、t.isAlive() --判断线程是否为激活状态
7、t.setDaemon() --设置为后台线程或前台线程(默认:False)
8、t.isDaemon() --判断是否为守护线程
9、t.ident() --获取线程的标识符。线程标识符是一个非零整数,只有在调用start()方法后,该属性才有效,否则它只返回None
10、t.join() --逐个执行每个线程,执行完毕后继续往下执行,该方法使得多线程变得无意义。
11、t.run() --线程被cpu调度后自动执行线程对象的run方法
1.3、python线程锁
当有一个数据有多个线程对其进行修改的时候,任何一个线程改变他都会对其他线程造成影响,如果我们想某一个线程在使用完之前,其他线程不能对其修改,就需要对这个线程加一个线程锁。
简单的线程锁实例:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 """ 4 线程锁小实例 5 """ 6 import threading 7 import time 8 9 globals_num = 0 10 11 lock = threading.RLock() 12 13 def Func(): 14 lock.acquire() #获取锁 15 global globals_num 16 globals_num += 1 17 time.sleep(1) 18 print(globals_num) 19 lock.release() #释放锁 20 21 for i in range(10): 22 t = threading.Thread(target=Func) 23 t.start()
代码执行结果:
threading.RLock和threading.Lock 的区别
RLock允许在同一线程中被多次acquire。而Lock却不允许这种情况。 如果使用RLock,那么acquire和release必须成对出现,即调用了n次acquire,必须调用n次的release才能真正释放所占用的琐。
1 import threading 2 lock = threading.Lock() #Lock对象 3 lock.acquire() 4 lock.acquire() #产生了死琐。 5 lock.release() 6 lock.release() 7 8 9 10 import threading 11 rLock = threading.RLock() #RLock对象 12 rLock.acquire() 13 rLock.acquire() #在同一线程内,程序不会堵塞。 14 rLock.release() 15 rLock.release()
1.4、threading.Event
1、python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法:set、wait、clear。
2、事件处理的机制:全局定义了一个Flag,如果Flag值为False,那么当程序执行event.wait方法时就会阻塞,
如果Flag值为True,那么event.wait方法时便不再阻塞。
方法说明:
clear --将Flag设置为False
set -- 将Flag设置为True
Event.isSet() --判断标识符是否为True
threading.Event简单实例:
当线程执行的时候,如果flag为False,则线程会阻塞,当flag为True的时候,线程不会阻塞。它提供了本地和远程的并发性。
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 """ 4 threading.Event事件实例 5 """ 6 import threading 7 8 def do(event): 9 print("start.....") 10 event.wait() 11 print("execuse...") 12 13 event_obj = threading.Event() 14 15 for i in range(5): 16 t = threading.Thread(target=do, args=(event_obj,)) 17 t.start() 18 19 event_obj.clear() 20 inp = input(‘input:(true) ‘) 21 if inp == "true": 22 event_obj.set()
代码执行结果:
原文:https://www.cnblogs.com/june-L/p/11795631.html