对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日

相关文章

  • python读取文件名称生成list的方法

    以下是“Python读取文件名称生成list的方法”的完整攻略。 1. Python读取文件名称 在Python中,我们可以使用os模块来读取文件名称。os模块供了许多与操作系统交互的函数,包括文件和目录操作。其中,os.listdir()函数可以返回指定目录下的所有文件和录的名称列表。 示例1:使用os.listdir()函数读取文件名称 假设我们有一个名…

    python 2023年5月13日
    00
  • python pipeline的用法及避坑点

    Python Pipeline的用法及避坑点 什么是Python Pipeline Python Pipeline指的是一系列的数据处理步骤,每个步骤把数据从上一个步骤中获取并将处理结果输出给下一个步骤,最终得到需要的结果。 在数据处理的过程中,我们可能需要进行多个步骤的处理,如数据清洗、特征选择、模型训练等。如果每个步骤都要手动编写代码来进行处理,会增加开…

    python 2023年5月14日
    00
  • Pytorch 如何实现常用正则化

    以下是详细讲解“Pytorch如何实现常用正则化”的完整攻略,包括正则化的介绍、Pytorch中常用的正则化方法、示例说明和注意事项。 正则化的介绍 在机器学习中,正则化是一种常用的技术,用于防止模型过拟合。正则化通过在损失函数中添加一个正则项,来惩罚模型的复杂度,从而使模型更加简单,避免过拟合。 Pytorch中常用的正则化方法 在Pytorch中,常用的…

    python 2023年5月14日
    00
  • python爬虫之利用Selenium+Requests爬取拉勾网

    Python爬虫之利用Selenium+Requests爬取拉勾网 一、前言 本篇文章将详细介绍如何使用Python编写Selenium+Requests实现的爬虫程序来爬取拉钩网的招聘信息。 二、技术选型 Selenium:对于使用AJAX或JavaScript进行渲染和交互的网站页面,Selenium可以完美模拟浏览器行为,进入页面、下拉和点击等操作都可…

    python 2023年5月14日
    00
  • 详解Python PIL Image.frombuffer()方法

    PIL(Python Imaging Library)是一个用于图像处理的Python库。其中,Image.frombuffer()方法可以根据给定的数据和描述创建一个新的图像对象。下面,我们来详细讲解Python PIL Image.frombuffer()方法的完整攻略。 方法签名 frombuffer(data, size, mode=’L’, dec…

    python-answer 2023年3月25日
    00
  • 图文详解Python如何导入自己编写的py文件

    以下是详细讲解“图文详解Python如何导入自己编写的py文件”的完整攻略。 问题描述 在Python中,我们经常需要使用到自己编写的一些模块或函数,这些模块或函数通常保存在.py文件中。那么如何在Python中导入这些.py文件呢? 解决方案 在Python中,我们可以使用import语句来导入我们自己编写的.py文件。具体的导入方式有以下几种: 直接导入…

    python 2023年6月3日
    00
  • pymysql之cur.fetchall() 和cur.fetchone()用法详解

    pymysql之cur.fetchall() 和cur.fetchone()用法详解 一、概述 pymysql是Python中操作MySQL数据库的一个常用库,在使用pymysql时,cur.fetchone()和cur.fetchall()是常见的两个方法,用于获取查询结果集中的一条或多条记录。本文将详细介绍这两个方法的用法。 二、fetchone方法 f…

    python 2023年6月3日
    00
  • Python:分层切片

    【问题标题】:Python: Hierarchical SlicingPython:分层切片 【发布时间】:2023-04-04 03:45:01 【问题描述】: 是否有更 Pythonic/numpythonic 的方式来进行某种嵌套/分层切片,即更漂亮的版本: _sum = 0 for i in np.arange(n): _sum += someFun…

    Python开发 2023年4月6日
    00
合作推广
合作推广
分享本页
返回顶部