【从零学习python 】81.Python多线程通信与队列的应用

简介: 【从零学习python 】81.Python多线程通信与队列的应用

线程间通信

线程之间有时需要进行通信,而操作系统提供了多种机制来实现进程间的通信。其中,我们经常使用的一种方式是使用队列(Queue)。

Queue的原理

Queue是一个先进先出(First In First Out)的队列。主线程中创建一个Queue对象,并作为参数传递给子线程。通过put()方法将数据放入队列中,通过get()方法从队列中取出数据。在调用get()方法后,队列中的数据会被同时删除。我们可以使用multiprocessing模块中的Queue实现多线程之间的数据传递。

import threading
import time
from queue import Queue
# 生产者函数,用于将数据放入队列中
def producer(queue):
    for i in range(100):
        print('{}存入了{}'.format(threading.current_thread().name, i))
        queue.put(i)
        time.sleep(0.1)
# 消费者函数,用于从队列中取出数据
def consumer(queue):
    for x in range(100):
        value = queue.get()
        print('{}取到了{}'.format(threading.current_thread().name, value))
        time.sleep(0.1)
        if not value:
            return
if __name__ == '__main__':
    # 创建一个队列对象
    queue = Queue()
    # 创建多个线程,并将队列对象作为参数传递给线程函数
    t1 = threading.Thread(target=producer, args=(queue,))
    t2 = threading.Thread(target=consumer, args=(queue,))
    t3 = threading.Thread(target=consumer, args=(queue,))
    t4 = threading.Thread(target=consumer, args=(queue,))
    t6 = threading.Thread(target=consumer, args=(queue,))
    # 启动线程
    t1.start()
    t2.start()
    t3.start()
    t4.start()
    t6.start()

在上述示例中,我们创建了一个Queue对象,并将其作为参数传递给多个线程。其中,producer函数用于将数据放入队列中,consumer函数用于从队列中取出数据。通过多个消费者线程的执行,可以实现多个线程之间对于共享队列的并发访问和通信。

具体代码解释如下:

  1. 导入所需的模块:threading用于创建和管理线程,time用于添加延迟效果,Queue用于创建队列对象。
  2. 定义生产者函数producer(queue),接收一个队列对象作为输入参数。该函数用于将数据放入队列中。
  3. 在生产者函数中使用一个循环,从0到99,将每个数字依次放入队列中。
  4. 使用threading.current_thread().name获取当前线程的名称,并打印存入的值。
  5. 使用queue.put(i)将数据放入队列中。
  6. 使用time.sleep(0.1)添加延迟效果。
  7. 定义消费者函数consumer(queue),同样接收一个队列对象作为输入参数。该函数用于从队列中取出数据。
  8. 在消费者函数中使用一个循环,从0到99,依次从队列中取出数据。
  9. 使用queue.get()获取队列中的数据,同时也会将该数据从队列中删除。
  10. 使用threading.current_thread().name获取当前线程的名称,并打印取出的值。
  11. 使用time.sleep(0.1)添加延迟效果。
  12. 如果取出的值为假值(即空),则返回函数,结束线程的执行。
  13. 在主程序中,创建一个队列对象queue
  14. 创建多个线程,并将队列对象作为参数传递给线程函数,分别创建了一个生产者线程和多个消费者线程。
  15. 启动线程,通过t.start()方法启动各个线程的执行。

通过以上代码,我们可以实现多个线程之间的通信,实现了生产者线程将数据放入队列中,多个消费者线程从队列中取出数据的过程。这样,我们就完成了线程间的通信。

相关文章
|
24天前
|
Java 调度
[Java]线程生命周期与线程通信
本文详细探讨了线程生命周期与线程通信。文章首先分析了线程的五个基本状态及其转换过程,结合JDK1.8版本的特点进行了深入讲解。接着,通过多个实例介绍了线程通信的几种实现方式,包括使用`volatile`关键字、`Object`类的`wait()`和`notify()`方法、`CountDownLatch`、`ReentrantLock`结合`Condition`以及`LockSupport`等工具。全文旨在帮助读者理解线程管理的核心概念和技术细节。
36 1
[Java]线程生命周期与线程通信
|
8天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
10天前
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
24 3
|
20天前
|
Java Unix 调度
python多线程!
本文介绍了线程的基本概念、多线程技术、线程的创建与管理、线程间的通信与同步机制,以及线程池和队列模块的使用。文章详细讲解了如何使用 `_thread` 和 `threading` 模块创建和管理线程,介绍了线程锁 `Lock` 的作用和使用方法,解决了多线程环境下的数据共享问题。此外,还介绍了 `Timer` 定时器和 `ThreadPoolExecutor` 线程池的使用,最后通过一个具体的案例展示了如何使用多线程爬取电影票房数据。文章还对比了进程和线程的优缺点,并讨论了计算密集型和IO密集型任务的适用场景。
38 4
|
25天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
16 1
|
25天前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
34 1
|
6天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
6天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
6天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!