python-多线程等概念
Posted 野生大魔王
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-多线程等概念相关的知识,希望对你有一定的参考价值。
并发 & 并行
并发:是指系统具有处理多个任务的能力
并行:是指系统具有 同时 处理多个任务的能力
并行 是 并发的一个子集
同步 & 异步
同步:当进程执行到一个I/O(等待外部数据的时候)----------等 : 同步
异步: ----------不等,直到接收到数据再回来执行
GIL:全局解释锁
因为有GIL锁,所以同一时刻,只有一个线程被CPU执行
任务:IO密集型
计算密集型
对于IO密集型:Python 的多线程是有意义的
可以采用多进程+协程
对于计算密集型:Python 的多线程就不推荐了,不适用了。
RLock(递归锁)
说白了就是在一个大锁中还要再包含子锁
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() print(‘--------between run1 and run2-----‘) res2 = 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是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去。
import threading,time def run(n): semaphore.acquire() time.sleep(1) print("run the thread: %s\n" %n) semaphore.release() if __name__ == ‘__main__‘: num= 0 semaphore = threading.BoundedSemaphore(5) #最多允许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
通过Event来实现两个或多个线程间的交互,下面是一个红绿灯的例子,即起动一个线程做交通指挥灯,生成几个线程做车辆,车辆行驶按红灯停,绿灯行的规则。
import threading,time import random def light(): if not event.isSet(): event.set() #wait就不阻塞 #绿灯状态 count = 0 while True: if count < 10: print(‘\033[42;1m--green light on---\033[0m‘) elif count <13: print(‘\033[43;1m--yellow light on---\033[0m‘) elif count <20: if event.isSet(): event.clear() print(‘\033[41;1m--red light on---\033[0m‘) else: count = 0 event.set() #打开绿灯 time.sleep(1) count +=1 def car(n): while 1: time.sleep(random.randrange(10)) if event.isSet(): #绿灯 print("car [%s] is running.." % n) else: print("car [%s] is waiting for the red light.." %n) if __name__ == ‘__main__‘: event = threading.Event() Light = threading.Thread(target=light) Light.start() for i in range(3): t = threading.Thread(target=car,args=(i,)) t.start()
队列queue (重点)
1,queue.Queue() FIFO队列-先进先出
2,queue.LifoQueue() LIFO队列,先进后出
3,queue.PriorityQueue() 按照优先级,越低越先出
方法:
q.size 返回队列大小
q.empty() 如果队列为空返回true
q.full() 如果队列为满返回true
q.get () 里面可以设置block 的t,f
q.put()
q.join()实际是队列为空时再执行别的操作
以上是关于python-多线程等概念的主要内容,如果未能解决你的问题,请参考以下文章