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)
View Code

 

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)
View Code

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()
View Code

队列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-多线程等概念的主要内容,如果未能解决你的问题,请参考以下文章

python 并发编程 多线程 GIL全局解释器锁基本概念

[Python3] 043 多线程 简介

python小白学习记录 多线程爬取ts片段

什么是多线程,多进程?

多线程编程

Python中并发多线程等