python浅谈一下线程间通信之队列

 更新时间:2023年04月24日 11:04:11   作者:真的不能告诉你我的名字  
本篇文章介绍了为什么需要线程间通信,以及通信方式有哪些,最后每种通信方式都举了一个例子,最常用的还是共享变量的方式来进行线程间通信。感兴趣的朋友可以阅读本文

为什么需要线程间通信

一个人的力量是有限的,但是团队合作可以发挥更大的作用。而团队协作需要交流和通信来有效的分配任务和协调工作,来保证保时保量的完成工作。

为什么线程间需要通信呢?这就好比一个团队需要完成一个工作,但是这个工作周期性比较长,复杂度也比较高,此时就需要团队协作了,领导就把工作分为了n份,abc员工每次领取1份工作,做完了再向老板同步,并且领取新的工作,这样的话,工作很快就做完了嘛。

将线程代入上面的例子,在某些任务中,可能需要多个线程来完成同样的任务,所以线程间通信是为了线程之间的协作和同步,更快的完成任务。

线程间通信方式有哪些

python多线程编程中,线程间通信方法主要有以下几种:

  • 共享变量

这是最常用,也是用的最多的方式,这个很好理解,在同一进程中,多个线程有一部分内存是共用进程的,所以多个线程可以使用“共享变量”的方式共享同一份数据,通过对该变量的读写操作来实现线程间通信。

  • 队列

python中,为我们提供了队列的标准库Queue,它是标准库中的一个安全队列的实现。作用是可以在多个线程间共享数据,主要用法为通过get方法将数据放入队列,get方法将数据从队列中取出来,

  • 管道

python管道是通过multiprocessing库中的Pipe实现的,可以在2个线程之间任意传递数据,而且是双向通信的,主要用法为通过send方法发送数据,通过recv方法接收数据。

除此之外,还有其他方法,例如 借助第三方工具,比如redis等。

线程间通信案例之队列

共享变量,我们之前就已经用过了,比如上一节,我们自己实现了python的读写锁,就用到了共享变量的方式。这里就不再过多阐述了。这里将介绍一下管道的案例:

队列多用于生产者消费者,在python中,是使用queue模块下的Queue方法,创建一个新的队列语句为:

queues = queue.Queue()

其中,Queue可以传入一个maxsize,它将作为队列的最大值,默认的话,是无限制。

想要往队列中写入数据的话,使用put方法即可,例如,向队列写入字符串"123",我们仅需要调用put方法即可,例如:

queues.put("123")

而想要从队列中获取数据的话,需要使用get方法,例如:

data = queues.get()
print(data)

除此之外,还有队列其他常用的方法,如: qsize()会返回队列中元素的数量,empty()会判断队列是否为空,full()会判断队列是否已经满了。

这里举一个文件分发下载的例子,我们需要定义一个生产者,用于发布任务,定义多个消费者,用于执行任务,代码如下:

在上述代码中,我们定义了生产者和消费者2个类,其初始方法__init__会传入队列信息,生产者有定义了2个方法,一个是put,是将元素放入队列中,还有一个是qsize,是返回当前队列的个数。而消费者只定义了一个方法get,上面写了一个死循环,向队列获取数据,每获取到一个数据,休息15秒。

在主函数中,我们定义了一个公共的队列queues,而后定义了生产者p和消费者q,二者都传入了同一个队列queues。最后我们写了3个线程,用于执行消费者qget方法。 和 调用一个生产者方法put

执行结果为:

上述结果展现的是,生产者生成数据,而消费者接收。file_0file_9都只被消费了一次,可见队列是自己保证了线程竞争问题的。

总结

本篇文章介绍了为什么需要线程间通信,以及通信方式有哪些,最后每种通信方式都举了一个例子,总的来说,最常用的还是共享变量的方式来进行线程间通信,但是此方法需要自己来保证线程竞争问题,除此之外,还有队列和管道,此二者不用担心线程竞争,但是前则更适用于生产者-消费者模型,后者更适用于两线程间相互通信。

到此这篇关于python浅谈一下线程间通信之队列的文章就介绍到这了,更多相关python通信队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python3的高阶函数map,reduce,filter的示例详解

    Python3的高阶函数map,reduce,filter的示例详解

    这篇文章主要介绍了Python3的高阶函数map,reduce,filter的示例代码,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • python使用aiohttp通过设置代理爬取基金数据简单示例

    python使用aiohttp通过设置代理爬取基金数据简单示例

    这篇文章主要为大家介绍了python使用aiohttp通过设置代理爬取基金数据简单示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • python如何发布自已pip项目的方法步骤

    python如何发布自已pip项目的方法步骤

    这篇文章主要介绍了python如何发布自已pip项目的方法步骤,方便大家学习,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Php多进程实现代码

    Php多进程实现代码

    这篇文章主要介绍了Php多进程实现编程实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • caffe binaryproto 与 npy相互转换的实例讲解

    caffe binaryproto 与 npy相互转换的实例讲解

    今天小编就为大家分享一篇caffe binaryproto 与 npy相互转换的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • python获取异常信息exc_info和print_exc的使用

    python获取异常信息exc_info和print_exc的使用

    python通过sys.exc_info获取异常信息,通过traceback.print_exc打印堆栈信息,包括错误类型和错误位置等信息,本文就来介绍一下具体用法,感兴趣的可以了解一下
    2023-12-12
  • Django框架 信号调度原理解析

    Django框架 信号调度原理解析

    这篇文章主要介绍了Django框架 信号调度原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Windows平台Python编程必会模块之pywin32介绍

    Windows平台Python编程必会模块之pywin32介绍

    在Windows平台上,从原来使用C/C++编写原生EXE程序,到使用Python编写一些常用脚本程序,成熟的模块的使用使得编程效率大大提高了
    2019-10-10
  • Python利用prettytable库输出好看的表格

    Python利用prettytable库输出好看的表格

    prettytable库就是这么一个工具,prettytable可以打印出美观的表格,并且对中文支持相当好。本文将介绍如何通过prettytable输出好看的表格,需要的可以参考一下
    2022-01-01
  • python 编码规范整理

    python 编码规范整理

    这篇文章主要介绍了python 编码规范整理,需要的朋友可以参考下
    2018-05-05

最新评论