多线程实现生产者消费者

Posted Captain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程实现生产者消费者相关的知识,希望对你有一定的参考价值。

1. Python多线程介绍

Python提供了两个有关多线程的标准库,thread和threading。thread提供了低级别的,原始的线程和一个锁。threading则是一个高级模块,提供了对thread的封装。一般情况下,使用threading是比较好的做法。
使用threading实现线程,只需要从threading.Thread类继承,并重写其中的__init__()方法和run()方法。

from threading import Thread 

class MyThread(Thread): 
    def __init__(self): 
        Thread.__init__(self) 
    def run(self): 
        print(self.thread_id, "start")

 threading提供了一个锁:lock = threading.Lock(),调用锁的acquire()和release()方法可以使线程获得和释放锁。

需要注意的是,Python有一个GIL(Global Interpreter Lock)机制,任何线程在运行之前必须获取这个全局锁才能执行,每当执行完100条字节码,全局锁才会释放,切换到其他线程执行。

所以Python中的多线程不能利用多核计算机的优势,无论有多少个核,同一时间只有一个线程能得到全局锁,只有一个线程能够运行。

那么Python中的多线程有什么作用呢?为什么不直接使用Python中的多进程标准库?这里要根据程序执行的是IO密集型任务和计算密集型任务来选择。

当执行IO密集型任务时,比如Python爬虫,大部分时间都用在了等待返回的socket数据上,CPU此时是完全闲置的,这种情况下采用多线程较好。

当执行计算密集型任务时,比如图像处理,大部分时间CPU都在计算,这种情况下使用多进程才能真正的加速,使用多线程不仅得不到并行加速的效果,反而因为频繁切换上下文拖慢了速度。

2. threading实现生产者消费者

参考文章:https://www.jianshu.com/p/f09a112a71f7

以上是关于多线程实现生产者消费者的主要内容,如果未能解决你的问题,请参考以下文章

多线程_多生产者多消费者的实现问题

Java实现多线程生产者消费模型及优化方案

Java多线程-Lock锁的使用,以及生产者和消费者的实现

生产者消费者模型实现多线程异步交互

LINUX多线程(生产者消费者模型,POXIS信号量)

Java多线程(实现多线程线程同步生产者消费者)