Python常用模块之threading和Thread模块及线程通信

Python常用模块之threading和Thread模块及线程通信

简介

Python中可以使用Thread模块和threading模块来创建线程。其中Thread模块是低级模块,用于低级别的线程控制,而threading模块是高级模块,对Thread模块进行了封装,使得线程更加方便使用。本文将对这两个模块进行详细讲解,并讨论线程之间是如何进行通信的。

基本使用方法

使用Thread模块创建线程

使用Thread模块创建线程,需要完成以下步骤:

  1. 导入Thread模块
  2. 定义一个函数,作为线程要执行的任务
  3. 创建Thread对象,将定义的函数作为参数传递给它
  4. 调用Thread对象的start方法,启动线程

下面是一个示例代码:

import thread
import time

# 线程函数
def my_thread(name, delay):
    count = 0
    while count < 5:
        time.sleep(delay)
        count += 1
        print(name, "执行了", count, "次")

# 创建两个线程,并启动它们
try:
    thread.start_new_thread(my_thread, ("线程1", 1))
    thread.start_new_thread(my_thread, ("线程2", 2))
except:
    print("线程创建失败")

while True:
    pass # 无限循环,保持主线程不关闭

以上代码创建了两个线程,并启动它们。这两个线程会分别每秒钟和每两秒钟执行一次,分别输出"线程1"和"线程2"。

使用threading模块创建线程

使用threading模块创建线程,需要完成以下步骤:

  1. 导入threading模块
  2. 定义一个类,继承自threading.Thread,重写run方法作为线程要执行的任务
  3. 创建线程对象,将自定义的线程类实例作为参数传递给它
  4. 调用线程对象的start方法,启动线程

下面是一个使用threading模块创建线程的示例代码:

import threading
import time

# 线程类
class MyThread(threading.Thread):
    def __init__(self, name, delay):
        super().__init__()
        self.name = name
        self.delay = delay

    def run(self):
        count = 0
        while count < 5:
            time.sleep(self.delay)
            count += 1
            print(self.name, "执行了", count, "次")

# 创建两个线程,并启动它们
try:
    t1 = MyThread("线程1", 1)
    t2 = MyThread("线程2", 2)
    t1.start()
    t2.start()
except:
    print("线程创建失败")

while True:
    pass # 无限循环,保持主线程不关闭

这个代码与使用Thread模块创建线程的代码是等效的。

线程通信

Python中的线程之间可以使用多种方式进行通信,常见的方式包括:

  1. 使用共享变量
  2. 使用队列
  3. 使用事件

使用共享变量

共享变量是多个线程可以访问并修改的变量。对于共享变量,需要使用线程锁来保证数据的正确性。

下面是一个使用共享变量进行线程通信的示例代码:

import threading
import time

# 共享变量
g_num = 0
g_num_lock = threading.Lock()

# 线程类
class MyThread(threading.Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        global g_num
        while True:
            g_num_lock.acquire() # 获得线程锁
            if g_num >= 10:
                g_num_lock.release() # 如果已经大于等于10,就释放线程锁
                break
            g_num += 1
            print(self.name, "把 g_num 变成了", g_num)
            g_num_lock.release() # 释放线程锁

# 创建两个线程,并启动它们
try:
    t1 = MyThread("线程1")
    t2 = MyThread("线程2")
    t1.start()
    t2.start()
except:
    print("线程创建失败")

while True:
    if g_num >= 10:
        break
    time.sleep(1)

print("所有线程执行结束")

以上代码使用了一个共享变量g_num,两个线程不断对它进行加1操作,并输出结果。如果g_num已经大于等于10,则线程执行结束。

使用队列

队列是一个线程安全的数据结构,可以用来在线程之间传递数据。队列提供了put和get方法,分别用于将数据加入队列和从队列中取出数据。当队列为空或已满时,put和get方法会阻塞。

下面是一个使用队列进行线程通信的示例代码:

import threading
import time
from queue import Queue

# 队列
q = Queue()

# 线程类
class ProducerThread(threading.Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        while True:
            if q.qsize() < 10:
                q.put(1)
                print(self.name, "向队列中加入了一个数据,当前队列大小为", q.qsize())
                time.sleep(1)
            else:
                print("队列已满,等待1秒")
                time.sleep(1)

class ConsumerThread(threading.Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        while True:
            if q.qsize() > 0:
                q.get()
                print(self.name, "从队列中取出了一个数据,当前队列大小为", q.qsize())
                time.sleep(1)
            else:
                print("队列已空,等待1秒")
                time.sleep(1)

# 创建两个线程,并启动它们
try:
    t1 = ProducerThread("生产者线程")
    t2 = ConsumerThread("消费者线程")
    t1.start()
    t2.start()
except:
    print("线程创建失败")

while True:
    pass # 无限循环,保持主线程不关闭

以上代码包含了一个生产者线程和一个消费者线程,生产者线程将数据加入队列,消费者线程从队列中取出数据。当队列已满或已空时,线程会等待1秒再进行操作。

使用事件

事件是一种线程同步机制,用于在线程之间传递信号。事件有set和clear方法,分别用于设置和清除事件标志,wait方法用于阻塞线程,直到事件标志被设置。

下面是一个使用事件进行线程通信的示例代码:

import threading
import time

# 事件
e = threading.Event()

# 线程类
class WaitThread(threading.Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        print(self.name, "等待事件触发")
        e.wait() # 等待事件
        print(self.name, "收到了事件")

# 创建线程并启动它
try:
    t = WaitThread("等待线程")
    t.start()
except:
    print("线程创建失败")

time.sleep(2) # 等待2秒

# 触发事件
e.set()
print("事件被触发")

while True:
    pass # 无限循环,保持主线程不关闭

以上代码包含了一个等待线程和一个触发事件的主线程。等待线程调用wait方法等待事件触发,而主线程使用set方法触发事件,并输出相关信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python常用模块之threading和Thread模块及线程通信 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 基于python实现获取网页图片过程解析

    在Python中,我们可以使用requests库和BeautifulSoup库来获取网页图片。本文将介绍如何基于Python实现获取网页图片的过程解析。我们将提供两个示例,以帮助读者更好地理解如何实现这个目标。 步骤1:安装必要的库 在使用Python程序获取网页图片之前,我们需要安装必要的库。我们使用以下库: requests:用于发送HTTP请求和获取响…

    python 2023年5月15日
    00
  • python3实现ftp服务功能(客户端)

    下面是关于 “Python3实现FTP服务功能(客户端)”的攻略: 什么是FTP FTP即文件传输协议(File Transfer Protocol),是用于在计算机网络上进行文件传输的协议。FTP可以将文件从一个计算机传输到另一个计算机,也可以用于在计算机之间共享文件。通常情况下,FTP用于从FTP服务器上下载文件或上传文件到FTP服务器上。 Python…

    python 2023年6月3日
    00
  • 在Python中使用NumPy将Hermite_e系列提高到一个幂数

    将Hermite_e系列提升到一个更高的幂,可以通过NumPy的多项式模块numpy.polynomial.hermite_e实现。下面是详细步骤: 导入所需模块 使用NumPy之前,需要先导入相关模块。因此,我们需要将numpy和numpy.polynomial.hermite_e两个模块导入到Python环境中。 import numpy as np f…

    python-answer 2023年3月25日
    00
  • 一篇文章带你了解谷歌这些大厂是怎么写 python 代码的

    一篇文章带你了解谷歌这些大厂是怎么写Python代码的 作为一名Python开发者,我们应该如何写出高质量、高效率的Python代码?这就需要我们去了解那些在业界颇有影响力的大厂是怎样写Python代码的。本文将以谷歌为例,带大家了解谷歌这些大厂是怎么写Python代码的。 1. 代码风格 谷歌采用了PEP 8作为Python代码风格的基本规范。PEP 8提…

    python 2023年5月18日
    00
  • python可视化plotly 图例(legend)设置

    Python可视化库plotly是一个功能强大的数据可视化工具,支持各种常见图表类型和交互式可视化。在绘制数据图表时,图例(legend)是一个非常重要的部分,它可以使读者更好地理解数据图表中不同系列的含义。在这里,我们将详细讲解如何在plotly中设置图例。 设置图例(legend) 图例是一种视觉元素,它与绘图联系在一起。在plotly中,图例默认是开启…

    python 2023年5月18日
    00
  • Python实战之实现简单的名片管理系统

    Python实战之实现简单的名片管理系统 实现思路 本名片管理系统基于Python语言实现,使用字典来存储每个名片的信息。系统运行时,首先展示主菜单,用户可以选择添加名片、显示全部名片、查询名片或退出系统。根据用户选择,进行相应的功能操作,将信息保存到字典或者从字典中查询信息。实现整个过程需要使用函数、循环、条件语句等基本编程元素。 代码实现 1. 主程序代…

    python 2023年5月30日
    00
  • 如何使用python在SQL Server中将字符串数据类型类型的行转换为XML数据类型

    【问题标题】:How to convert rows of string data type type to XML data type in SQL Server using python如何使用python在SQL Server中将字符串数据类型类型的行转换为XML数据类型 【发布时间】:2023-04-02 04:11:02 【问题描述】: 我在我的 …

    Python开发 2023年4月8日
    00
  • python实现银行账户系统

    Python实现银行账户系统攻略 系统需求 在实现银行账户系统前,我们需要明确系统的需求: 用户可以注册账户,并设置初始余额; 用户可以查询当前余额; 用户可以进行存款、取款等操作; 用户可以查询交易明细。 代码实现 我们可以通过Python的面向对象编程实现银行账户系统。具体实现过程如下: 定义 BankAccount 类,并在类中包含以下功能: 构造函数…

    python 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部