欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python高阶-多线程

程序员文章站 2022-03-11 21:20:05
一、GIL锁全局解释性锁让Python同一时刻只有一个线程在CPU上运行字节码无法将多个线程映射到多个CPU上同时运行二、线程同步主要讲锁相关的知识锁实现了上下文协议即 __enter__ __exit__ 可以用with语句1、LockPython中最基础的锁一个上锁对应一个释放锁2、RLock可重入锁,上几把锁就需要释放几次3、Condition条件变量from threading import Thread, Conditiondef speak(cond)...

一、GIL锁

全局解释性锁
让Python同一时刻只有一个线程在CPU上运行字节码
无法将多个线程映射到多个CPU上同时运行

二、线程同步

主要讲锁相关的知识
锁实现了上下文协议即 __enter__ __exit__ 可以用with语句

1、Lock

Python中最基础的锁
一个上锁对应一个释放锁

2、RLock

可重入锁,上几把锁就需要释放几次

3、Condition

条件变量
from threading import Thread, Condition


def speak(cond):
    with cond:
        print("开始讲话")
        cond.notify() # 释放锁,使wait解除堵塞
        cond.wait()
        print("接收到接受者信息")
        cond.notify()
        cond.wait()


def listen(cond):
    with cond: #或者直接cond.acquire(),此时结束的时候要释放锁
        cond.wait() # 释放上面cond的锁,产生一把新的锁,放到一个双向队列中,此时堵塞
        print("开始收听")
        cond.notify()
        cond.wait()
        print("接收到讲话者信息")
        cond.notify()
if __name__ == '__main__':
    cond = Condition()
    t1 = Thread(target=speak, args=(cond,))
    t2 = Thread(target=listen, args=(cond,))
    t2.start()
    t1.start()


4、Semaphore

信号量
可以用来控制同时运行的线程数量
import time
from threading import Semaphore, Thread


def get_html_url(s, t):
    with s:
     # s.acquire() value -1  
     #s.release()  value +1
     # 当value = 0 会堵塞
        print(f"{t}")
        time.sleep(2)


if __name__ == '__main__':
    s = Semaphore(3) # 控制线程数量
    for i in range(20):
        t = Thread(target=get_html_url, args=(s, i))
        t.start()

三、线程池

#主要要去了解源码,submit返回的future对象
import time
from concurrent.futures import ThreadPoolExecutor,as_completed

# as_completed接受iterable ,iterable中是Future对象

def func(*args):
    time.sleep(2)
    print(args)


executor = ThreadPoolExecutor(3) 
#线程池的实例对象中有map方法,map(func,iterable) # iterable为函数的参数
for i in range(10):
    future=executor.submit(func, (1, 2, 3))
    future,done() #线程运行状态
    future.cancel() #取消还未运行的线程
    future.result() #线程运行结果,会堵塞
 # map 和as_completed都是的返回值都是iterable 可以用for循环

本文地址:https://blog.csdn.net/qq_43006401/article/details/110457188