iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python3 queue多线程通信怎么实现
  • 784
分享到

python3 queue多线程通信怎么实现

2023-07-02 17:07:36 784人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍了python3 queue多线程通信怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python3 queue多线程通信怎么实现文章都会有所收获,下面我们一起来看看吧

这篇文章主要介绍了python3 queue多线程通信怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python3 queue多线程通信怎么实现文章都会有所收获,下面我们一起来看看吧。

queue分类

python3 queue分三类:

  • 先进先出队列

  • 后进先出的栈

  • 优先级队列

他们的导入方式分别是:

from queue import Queuefrom queue import LifoQueuefrom queue import

具体方法见下面引用说明。

例子一、生产消费模式

Queue 对象已经包含了必要的,所以你可以通过它在多个线程间多安全地共享数据。 当使用队列时,协调生产者和消费者的关闭问题可能会有一些麻烦。一个通用的解决方法是在队列中放置一个特殊的值,当消费者读到这个值的时候,终止执行。

例如:

from queue import Queuefrom threading import Thread# 用来表示终止的特殊对象_sentinel = object()# A thread that produces datadef producer(out_q):for i in range(10):print("生产")out_q.put(i)out_q.put(_sentinel)# A thread that consumes datadef consumer(in_q):while True:data = in_q.get()if data is _sentinel:in_q.put(_sentinel)breakelse:print("消费", data)# Create the shared queue and launch both threadsq = Queue()t1 = Thread(target=consumer, args=(q,))t2 = Thread(target=producer, args=(q,))t1.start()t2.start()

结果:

python3 queue多线程通信怎么实现

本例中有一个特殊的地方:消费者在读到这个特殊值之后立即又把它放回到队列中,将之传递下去。这样,所有监听这个队列的消费者线程就可以全部关闭了。 尽管队列是最常见的线程间通信机制,但是仍然可以自己通过创建自己的数据结构并添加所需的锁和同步机制来实现线程间通信。最常见的方法是使用 Condition变量来包装你的数据结构。下边这个例子演示了如何创建一个线程安全的优先级队列。

import heapqimport threadinGClass PriorityQueue:def __init__(self):self._queue = []self._count = 0self._cv = threading.Condition()def put(self, item, priority):with self._cv:heapq.heappush(self._queue, (-priority, self._count, item))self._count += 1self._cv.notify()def get(self):with self._cv:while len(self._queue) == 0:self._cv.wait()return heapq.heappop(self._queue)[-1]

例子二、task_done和join

使用队列来进行线程间通信是一个单向、不确定的过程。通常情况下,你没有办法知道接收数据的线程是什么时候接收到的数据并开始工作的。不过队列对象提供一些基本完成的特性,比如下边这个例子中的task_done()join()

from queue import Queuefrom threading import Threadclass Producer(Thread):def __init__(self, q):super().__init__()self.count = 5self.q = qdef run(self):while self.count > 0:print("生产")if self.count == 1:self.count -= 1self.q.put(2)else:self.count -= 1self.q.put(1)class Consumer(Thread):def __init__(self, q):super().__init__()self.q = qdef run(self):while True:print("消费")data = self.q.get()if data == 2:print("stop because data=", data)# 任务完成,从队列中清除一个元素self.q.task_done()breakelse:print("data is Good,data=", data)# 任务完成,从队列中清除一个元素self.q.task_done()def main():q = Queue()p = Producer(q)c = Consumer(q)p.setDaemon(True)c.setDaemon(True)p.start()c.start()# 等待队列清空q.join()print("queue is complete")if __name__ == '__main__':main()

结果:

python3 queue多线程通信怎么实现

例子三、多线程里用queue

设置俩队列,一个是要做的任务队列todo_queue,一个是已经完成的队列done_queue
每次执行线程,先从todo_queue队列里取出一个值,然后执行完,放入done_queue队列。
如果todo_queue为空,就退出。

import loggingimport logging.handlersimport threadingimport queuelog_mgr = Nonetodo_queue = queue.Queue()done_queue = queue.Queue()class LogMgr:def __init__(self, logpath):self.LOG = logging.getLogger('log')loghd = logging.handlers.RotatingFileHandler(logpath, "a", 0, 1)fmt = logging.FORMatter("%(asctime)s %(threadName)-10s %(message)s", "%Y-%m-%d %H:%M:%S")loghd.setFormatter(fmt)self.LOG.addHandler(loghd)self.LOG.setLevel(logging.INFO)def info(self, msg):if self.LOG is not None:self.LOG.info(msg)class Worker(threading.Thread):global log_mgrdef __init__(self, name):threading.Thread.__init__(self)self.name = namedef run(self):while True:try:task = todo_queue.get(False)if task:log_mgr.info("HANDLE_TASK: %s" % task)done_queue.put(1)except queue.Empty:breakreturndef main():global log_mgrlog_mgr = LogMgr("mylog")for i in range(30):todo_queue.put("data"+str(i))workers = []for i in range(3):w = Worker("worker"+str(i))workers.append(w)for i in range(3):workers[i].start()for i in range(3):workers[i].join()total_num = done_queue.qsize()log_mgr.info("TOTAL_HANDLE_TASK: %d" % total_num)exit(0)if __name__ == '__main__':main()

输出日志文件结果:

python3 queue多线程通信怎么实现

关于“Python3 queue多线程通信怎么实现”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“python3 queue多线程通信怎么实现”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网Python频道。

--结束END--

本文标题: python3 queue多线程通信怎么实现

本文链接: https://www.lsjlt.com/news/343354.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python3 queue多线程通信怎么实现
    这篇文章主要介绍了python3 queue多线程通信怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python3 queue多线程通信怎么实现文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-02
  • python3 queue多线程通信
    目录queue分类例子一、生产消费模式例子二、task_done和join例子三、多线程里用queuequeue分类 python3 queue分三类: 先进先出队列后进先出的栈优先...
    99+
    2024-04-02
  • Java中怎么实现多线程通信
    Java中怎么实现多线程通信,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。概述多线程通信问题,也就是生产者与消费者问题生产者和消费者为两个线程,两个线程在运行过程中交替睡眠,生...
    99+
    2023-06-20
  • Java中的多线程如何实现线程通信
    这篇文章将为大家详细讲解有关Java中的多线程如何实现线程通信,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java多线程中线程间的通信一、使用while方式来实现线程之间的通信packag...
    99+
    2023-05-31
    java 多线程 线程通信
  • 怎么在java中实现线程通信
    本篇文章给大家分享的是有关怎么在java中实现线程通信,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应...
    99+
    2023-06-14
  • python中Queue怎么通信
    这篇文章主要介绍了python中Queue怎么通信,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,...
    99+
    2023-06-14
  • C++Thread实现简单的socket多线程通信
    目录起因服务端ROS客户端普通客户端运行效果不足起因 为什么要用C++的Thread,很简单,因为我菜 一打五用pthread实现了socket多线程通信,我之前学并发的时候没看pt...
    99+
    2024-04-02
  • 怎么使用C++ Thread实现简单的socket多线程通信
    本篇内容介绍了“怎么使用C++ Thread实现简单的socket多线程通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!服务端多...
    99+
    2023-07-02
  • 怎么在java中实现线程间通信
    这篇文章将为大家详细讲解有关怎么在java中实现线程间通信,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。线程间通信:由于多线程共享地址空间和数据空间,所以多个线程间的通信是一个线程的数据可以...
    99+
    2023-05-30
    java
  • java中多线程怎么进行通信
    今天就跟大家聊聊有关java中多线程怎么进行通信,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、概要线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线...
    99+
    2023-05-31
    java 多线程通信 ava
  • python中的Queue怎么通信
    这篇文章主要介绍了python中的Queue怎么通信的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python中的Queue怎么通信文章都会有所收获,下面我们一起来看看吧。说明Queue可以使用multipro...
    99+
    2023-06-30
  • Java多线程编程实现socket通信示例代码
    流传于网络上有关Java多线程通信的编程实例有很多,这一篇还算比较不错,代码可用。下面看看具体内容。TCP是Tranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的...
    99+
    2023-05-30
    java socket通信 ava
  • Java中怎么实现线程间通信与信号量
    Java中怎么实现线程间通信与信号量,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.信号量Semaphore先说说Semaphore,Semaphore可以控制某个资源可...
    99+
    2023-05-30
    java
  • 怎么在c#中利用委托事件实现多线程通信
    本篇文章为大家展示了怎么在c#中利用委托事件实现多线程通信,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在研究c# 线程之间通信时,发现传统的方法大概有三种:全局变量,由于同一进程下的多个进程之间共...
    99+
    2023-06-14
  • Python多线程中Queue模块怎么用
    这篇文章将为大家详细讲解有关Python多线程中Queue模块怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。queue介绍queue是python中的标准库,俗称队列,可以直接import 引用,在...
    99+
    2023-06-20
  • Java如何实现线程通信
    今天小编给大家分享一下Java如何实现线程通信的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是线程通信、如何实现所谓线程...
    99+
    2023-06-30
  • python3实现多线程ping一个网段
    ####################################################""" 实现多线程ping一个网段的地址,测试联通性 copyright  2016/9/30 lighter_py"""#######...
    99+
    2023-01-31
    网段 多线程 ping
  • 如何使用Go语言实现多线程Websocket通信
    在近年来,实时通信已经成为了一种基本的需要。WebSocket则更是实时通信当中的佼佼者,它能够更快速、有效地实现客户端和服务器端之间的实时通信。而Go语言也作为近年来较火热的一种语言,被广泛应用于实时通信中。利用Go语言的优点以及多线程处...
    99+
    2023-12-14
    多线程 Go语言 Websocket通信
  • 【JavaSE专栏80】多线程通信,多个线程之间如何实现信息传递和同步?
    作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。 主打方向:Vue、SpringB...
    99+
    2023-09-06
    java 开发语言 后端 多线程 jvm 多线程通信 线程 原力计划
  • Java编程之多线程死锁与线程间通信简单实现代码
    死锁定义 死锁是指两个或者多个线程被永久阻塞的一种局面,产生的前提是要有两个或两个以上的线程,并且来操作两个或者多个以上的共同资源;我的理解是用两个线程来举例,现有线程A和B同时操作两个共同资源a和b,A操作a的时候上锁LockA,继续执行...
    99+
    2023-05-30
    java 多线程 ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作