本篇内容介绍了“python线程间通信之队列怎么创建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
一个人的力量是有限的,但是团队合作可以发挥更大的作用。而团队协作需要交流和通信来有效的分配任务和协调工作,来保证保时保量的完成工作。
为什么线程间需要通信呢?这就好比一个团队需要完成一个工作,但是这个工作周期性比较长,复杂度也比较高,此时就需要团队协作了,领导就把工作分为了n
份,a
、b
、c
员工每次领取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个线程,用于执行消费者q
的get
方法。 和 调用一个生产者方法put
。
执行结果为:
上述结果展现的是,生产者生成数据,而消费者接收。file_0
到file_9
都只被消费了一次,可见队列是自己保证了线程竞争问题的。
“python线程间通信之队列怎么创建”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。