对python:threading.Thread类的使用方法详解

python:threading.Thread 类的使用方法详解

在 Python 中,通过使用 threading 模块来实现多线程编程,而 threading.Thread 类则是其中最重要的一个类,它允许我们创建一个线程对象。

创建线程对象

threading.Thread 类的构造函数如下:

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

其中,group 参数已废弃,不做介绍。其他参数说明如下:

  • target:要执行的线程函数。
  • name:线程的名称。
  • args:一个元组,表示要传给线程函数的位置参数(可以为空元组)。
  • kwargs:一个字典,表示要传给线程函数的关键字参数(可以为空字典)。
  • daemon:线程的守护状态。默认为 None,表示与主线程非守护线程相同;否则为 True,表示守护线程。

下面是一个简单的示例:

import threading

def print_num(num):
    print(f"Num: {num}\n")

thread = threading.Thread(target=print_num, args=(10,), name="Print-Num-Thread")

在这个示例中,我们通过 threading.Thread 类创建了一个名为 Print-Num-Thread 的线程对象 thread,并将其绑定到了 print_num 函数上(即 target 参数)。

同时,我们还使用了位置参数 10(表示要打印的数字),将其传给了 print_num 函数(即 args 参数)。

启动线程

线程对象创建完成后,可以通过调用它的 start 方法来启动线程。例如:

import threading

def print_num(num):
    print(f"Num: {num}\n")

thread = threading.Thread(target=print_num, args=(10,), name="Print-Num-Thread")
thread.start()

在这个示例中,我们调用了 thread.start() 方法来启动线程。当线程启动后,它将会自动调用 print_num 函数,并将位置参数 10 传给它。因此,这个程序将会打印出如下结果:

Num: 10

等待线程结束

如果需要等待已经启动的线程执行完成后再继续执行主线程,可以使用 join 方法。例如:

import threading
import time

def print_num(num):
    time.sleep(5)  # 模拟一个耗时的操作
    print(f"Num: {num}\n")

thread = threading.Thread(target=print_num, args=(10,), name="Print-Num-Thread")
thread.start()

print("Waiting for Print-Num-Thread to finish...")
thread.join()
print("Print-Num-Thread has finished!")

在这个示例中,我们在 print_num 函数中添加了一个 time.sleep(5) 的语句,以模拟一个耗时的操作。在主线程中,我们启动了线程,并调用了 thread.join() 方法,以等待线程执行完成。当线程执行完成后,主线程将会打印出如下结果:

Waiting for Print-Num-Thread to finish...
Num: 10
Print-Num-Thread has finished!

示例说明

示例 1:多线程爬虫

假设我们需要同时爬取两个网页的数据,我们可以使用线程来实现多个爬虫同时运行。以下是示例代码:

import threading
import urllib.request
import time

def crawl_page(url):
    print(f"Crawling {url} ...")
    content = urllib.request.urlopen(url).read()
    print(f"Length of {url} = {len(content)}")

t1 = threading.Thread(target=crawl_page, args=('https://www.baidu.com',))
t2 = threading.Thread(target=crawl_page, args=('https://www.python.org',))

t1.start()
t2.start()

t1.join()
t2.join()

print("All done!")

在这个示例中,我们定义了一个 crawl_page 函数,它接收一个字符串类型的 URL,并使用 urllib.request.urlopen 函数来获取网页内容。

接着,我们创建了两个线程 t1t2,分别爬取 https://www.baidu.comhttps://www.python.org 两个网页的内容。

最后,我们调用了 t1.join()t2.join() 方法,以等待两个线程执行完成,最终输出 All done!

示例 2:多线程计算

假设我们需要同时计算数组中每个元素的平方,我们可以使用线程来实现多个计算任务同时运行。以下是示例代码:

import threading

def calc_squares(numbers):
    for num in numbers:
        print(f"{num} ^ 2 = {num ** 2}")

nums1 = [1, 2, 3, 4, 5]
nums2 = [6, 7, 8, 9, 10]

t1 = threading.Thread(target=calc_squares, args=(nums1,))
t2 = threading.Thread(target=calc_squares, args=(nums2,))

t1.start()
t2.start()

t1.join()
t2.join()

print("All done!")

在这个示例中,我们定义了一个 calc_squares 函数,它接收一个数字列表 numbers,并遍历其中的每个元素计算其平方。

接着,我们创建了两个线程 t1t2,分别计算 nums1nums2 两个列表中所有元素的平方。

最后,我们调用了 t1.join()t2.join() 方法,以等待两个线程执行完成,最终输出 All done!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:对python:threading.Thread类的使用方法详解 - Python技术站

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

相关文章

  • IE的事件传递-event.cancelBubble示例介绍

    IE的事件传递包含三个阶段:事件捕获阶段、目标元素阶段、事件冒泡阶段。当事件发生时,IE会首先从最外层元素开始,一步步地向事件的目标(被点击的元素)传递,然后再返回,并依次触发每个元素上的事件处理程序。 其中,event.cancelBubble是IE中阻止事件冒泡的方法,该方法可以被使用在事件处理程序内。 以下是两个示例说明: 示例1: 停止事件冒泡 va…

    python 2023年6月13日
    00
  • Python:在字符串列表中查找子字符串

    【问题标题】:Python: Find substring in list of stringPython:在字符串列表中查找子字符串 【发布时间】:2023-04-03 03:22:01 【问题描述】: 我有两个列表:songs 是歌曲名称列表,filenames 是通过运行 os.listdir() 生成的歌曲 MP3 文件列表。 songs = [‘T…

    Python开发 2023年4月8日
    00
  • 解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题

    为了解决 PyCharm 编辑区显示 YAML 文件层级结构遇中文乱码的问题,我们可以按照以下步骤进行操作: 1. 打开 PyCharm 设置 点击 PyCharm 菜单栏中的 File -> Settings 进入 PyCharm 设置页面。 2. 找到 YAML 设置 在设置页面的左侧列表中,找到 Editor -> File Types -…

    python 2023年5月20日
    00
  • Python3.6基于正则实现的计算器示例【无优化简单注释版】

    Python3.6基于正则实现的计算器示例【无优化简单注释版】攻略 什么是Python3.6基于正则实现的计算器示例? Python3.6基于正则实现的计算器示例是一个简单的计算器程序,它使用Python3.6的正则表达式模块re实现了基本的四则运算功能。该示例程序可以帮助初学者了解Python3.6正则表达式的基本用法,并学习如何使用Python3.6实现…

    python 2023年5月14日
    00
  • Python中文件I/O高效操作处理的技巧分享

    Python中文件I/O高效操作处理的技巧分享 在Python中,文件I/O操作是非常常见的,特别是在数据处理和处理大量文本文件的场景中。本文将分享一些在文件I/O高效操作处理中可以使用的技巧和方法。 一、使用with语句 在打开文件时,我们通常使用open()函数来创建一个文件对象,但是在操作完文件后,我们必须手动关闭它。如果忘记关闭,程序会持续占用文件句…

    python 2023年6月2日
    00
  • 用python对excel查重

    以下是详细的实例教程。 准备工作 首先我们需要安装 pandas 和 xlrd 库,可以使用 pip 命令进行安装: pip install pandas xlrd 安装完成后,我们需要准备一个示例的 excel 文件,例如文件名为 example.xlsx,里面包含姓名和电话两列数据。 读取 Excel 文件 首先我们需要使用 pandas 库读取 exc…

    python 2023年5月13日
    00
  • python政策网字体反爬实例(附完整代码)

    让我来为您详细讲解一下“python政策网字体反爬实例(附完整代码)”这篇文章的完整攻略。 首先,文章介绍了政策网的字体反爬机制,即在页面中使用了自定义字体来显示文本内容,从而防止爬虫直接获取文本内容。为了解决这个问题,我们可以使用FontTools库将自定义字体的映射字典提取出来,然后将页面中的文本内容根据映射字典进行反解密,最终得到真正的文本内容。 其次…

    python 2023年5月14日
    00
  • Python利用装饰器click处理解析命令行参数

    下面我将详细介绍如何使用 Python 装饰器 click 来处理和解析命令行参数。 什么是 Click? Click 是一个 Python 命令行界面框架,它帮助开发者轻松地构建命令行应用程序。Click 通过装饰器来支持声明解析命令行参数,并且用于在 Python 函数中注册命令。 安装 Click 可以在终端中使用以下命令来安装 click: $ pi…

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