Python threading模块
直接调用
# !/usr/bin/env python # -*- coding:utf-8 -*- import threading import time def sayhi(num): print("running on number:%s" % num) time.sleep(3) if __name__ =='__main__': #生成两个线程实例 t1 = threading.Thread(target=sayhi,args=(1,)) t2 = threading .Thread(target = sayhi,args=(2,)) #启动两个线程 t1.start() t2.start() #打印线程名 print(t1.getName()) print(t2.getName())
继承调用
import threading import time class MyThread(threading.Thread): def __init__(self,num): # super(Mythread,self).__init__(self) threading.Thread.__init__(self) self.num = num def run(self): print('running on number%s' %self.num) time.sleep(3) if __name__ == '__main__': t1 = MyThread(1) t2 = MyThread(2) t1.start() t2.start()
批量处理多线程及等待
import threading import time def sayhi(num): print('running on number%s' %num) time.sleep(5) if __name__ == '__main__': ''' t1 = MyThread(1) t2 = MyThread(2) t1.start() t2.start() ''' t_list=[] #用于存储实例 for i in range(100): t = threading.Thread(target=sayhi,args =[i,] ) #循环创建实例 t.start() t_list.append(t) #将创建的实力添加到列表 for i in t_list:#循环列表中的创建的实例 i.join() #在每个列表后面添加等待 print('##############main###############')
守护线程(Daemon)
import threading import time def run(n): print('--------runnig----------') time.sleep(200) print('--------done------------') def main(self): for i in range(5): t = threading.Thread(target=run,args=[i,]) t.start() t.join() print('start thread',t.getName()) m = threading.Thread(target=main,args=[]) m.setDaemon(True)#将主线程设置为Daemon线程,它退出时,其它子线程会同时退出,不管是否执行完任务 m.start() print('-----main thread done-----')
线程锁(互斥锁Mutex)
# !/usr/bin/env python # -*- coding:utf-8 -*- import threading import time def addNum(): global num #在每个进程中都获得这个全局变量 print('----get num:%s' %num) time.sleep(2) lock.acquire()#修改数据前加锁 num-=1 lock.release()#修改后释放锁 num = 100 thread_list=[] lock = threading.Lock() #生成全局锁 for i in range(100): t=threading.Thread(target=addNum) t.start() thread_list.append(t) for t in thread_list: t.join() #等待所有线程执行完毕 print('final Num:%s'%num)
递归锁(RLock)
# !/usr/bin/env python # -*- coding:utf-8 -*- import threading,time def run1(): print("grab the first part data") lock.acquire() global num num +=1 lock.release() return num def run2(): print("grab the second part data") lock.acquire() global num2 num2+=1 lock.release() return num2 def run3(): lock.acquire()#加递归锁 res = run1() #调用run1方法 print('--------between run1 and run2-----') res2 = run2()#调用run2方法 lock.release()#释放递归锁 print(res,res2) if __name__ == '__main__': num,num2 = 0,0 #初始化变量 lock = threading.RLock()#创建线程锁 for i in range(10): t = threading.Thread(target=run3) #创建线程 t.start() while threading.active_count() != 1:#判断是否只剩一个线程 print(threading.active_count()) else: print('----all threads done---') print(num,num2)
Semaphore(信号量)
互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据.
# !/usr/bin/env python # -*- coding:utf-8 -*- import threading,time def run(n): semaphore.acquire() time.sleep(1) print("run the thread: %s " %n) semaphore.release() if __name__ == '__main__': num= 0 semaphore = threading.BoundedSemaphore(3) #最多允许5个线程同时运行 for i in range(20): t = threading.Thread(target=run,args=(i,)) t.start() while threading.active_count() != 1: pass #print threading.active_count() else: print('----all threads done---') print(num)
线程间同步和交互Event
An event is a simple synchronization object;
the event represents an internal flag, and threads
can wait for the flag to be set, or set or clear the flag themselves.
通过Event来实现两个或多个线程间的交互
Event = threading.Event()
even.wait()
event.set()
event.clear()
实例:
import threading,time def light(): if not event.isSet(): event.set() #wait就不阻塞 #绿灯状态 count = 0 while True: if count < 10: print('