Python创建线程

Python 提供了 _thread 和 threading 两个模块来支持多线程,其中 _thread 提供低级别的、原始的线程支持,以及一个简单的锁,正如它的名字所暗示的,一般编程不建议使用 thread 模块;而 threading 模块则提供了功能丰富的多线程支持。

Python 主要通过两种方式来创建线程:

使用 threading 模块的 Thread 类的构造器创建线程。

继承 threading 模块的 Thread 类创建线程类。

调用 Thread 类的构造器创建线程

调用 Thread 类的构造器创建线程很简单,直接调用 threading.Thread 类的如下构造器创建线程:

__init__(self, group=None, target=None, name=None, args=(), kwargs=None, *,daemon=None)

上面的构造器涉及如下几个参数:

group:指定该线程所属的线程组。目前该参数还未实现,因此它只能设为 None。

target:指定该线程要调度的目标方法。

args:指定一个元组,以位置参数的形式为 target 指定的函数传入参数。元组的第一个元素传给 target 函数的第一个参数,元组的第二个元素传给 target 函数的第二个参数……依此类推。

kwargs:指定一个字典,以关键字参数的形式为 target 指定的函数传入参数。

daemon:指定所构建的线程是否为后代线程。

通过 Thread 类的构造器创建井启动多线程的步骤如下:

调用 Thread 类的构造器创建线程对象。在创建线程对象时,target 参数指定的函数将作为线程执行体。

调用线程对象的 start() 方法启动该线程。

下面程序示范了通过 Thread 类的构造器来创建线程对象:

import threading

# 定义一个普通的action函数,该函数准备作为线程执行体
def action(max):
    for i in range(max):
        # 调用threading模块current_thread()函数获取当前线程
        # 线程对象的getName()方法获取当前线程的名字
        print(threading.current_thread().getName() +  " " + str(i))
# 下面是主程序(也就是主线程的执行体)
for i in range(100):
    # 调用threading模块current_thread()函数获取当前线程
    print(threading.current_thread().getName() +  " " + str(i))
    if i == 20:
        # 创建并启动第一个线程
        t1 =threading.Thread(target=action,args=(100,))
        t1.start()
        # 创建并启动第二个线程
        t2 =threading.Thread(target=action,args=(100,))
        t2.start()
print('主线程执行完成!')

上面程序中的主程序包含一个循环,当循环变量 i 等于 20 时创建并启动两个新线程:

创建了一个 Thread 对象,该线程的 target 为 action,这意味着它会将 action 函数作为线程执行体。接下来程序调用 start() 方法来启动t1线程。

再次创建了一个线程,其创建和启动方式与第一个线程完全相同。

运行上面程序,将会看到如图所示的界面。

2-1Z3041H32C17.jpg

虽然上面程序只显式创建并启动了两个线程,但实际上程序有三个线程,即程序显式创建的两个子线程和主线程。前面己经提到,当 Python 程序开始运行后,程序至少会创建一个主线程,主线程的线程执行体就是程序中的主程序(没有放在任何函数中的代码)。

从上图可以看出,此时程序中共包含三个线程,这三个线程的执行没有先后顺序,它们以并发方式执行:Thread-1 执行一段时间,然后可能 Thread-2 或 MainThread 获得 CPU 执行一段时间,接下来又换其他线程执行,这就是典型的线程并发执行,CPU 以快速轮换的方式在多个线程之间切换,从而给用户一种错觉,即多个线程似乎同时在执行。

通过上面介绍不难看出多线程的意义,如果不使用多线程,主程序直接调用两次 action() 函数,那么程序必须等第一次调用的 action() 函数执行完成,才会执行第二次调用的 action() 函数;必须等第二次调用的 action() 函数执行完成,才会继续向下执行主程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/334276.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用C#操作文件:一个实际案例——替换文件中的IP地址

标题: 使用C#操作文件:一个实际案例——替换文件中的IP地址 介绍: 欢迎阅读我的最新博客!今天,我们将探讨如何使用C#来处理一个实际的编程挑战:读取一个配置文件并替换其中的IP地址。这是一个非常常见的…

vue写了debugger谷歌浏览器打开控制台没进断点

vue代码中打了断点,谷歌打开f12进不了断点解决方案如下 1、打开谷歌浏览器控制台,点击设置 2、在 Ignore List 中将“Enable Ignore Listing”勾选去掉,然后就可以正常使用debugger了

Es bulk批量导入数据(1w+以上)

最近在学习es的理论知识以及实际操作,随时更新~ 概要:首先你得有1w条数据的json,然后用java读取json文件导入 一. 创建Json数据 首先我生成1.5w条数据,是为了实践分页查询,用from-size和scroll翻页去实践 生成四个字段…

UG机械制图的基本常识

目前来说工程图就是传递产品信息的工具,所以图纸一定不能出错,因为所有的设计都要转化为生产的输入。 一张完整的工程图应由图框,图素,尺寸标注以及技术要求这四部分组成, 图框包括图纸幅面:A0,A1,A2,A3,…

(2024,VMamba,交叉扫描,线性复杂度,全局感受野,动态权重)视觉状态空间模型

VMamba: Visual State Space Model 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 3. 方法 3.1 基础概念 3.2 2D 选择性扫描 3.3 VMamba 模型 3.3.1 整体架构 3.3.2 VSS…

nvm, node.js, npm, yarn 安装配置

文章目录 nvm 安装node.js 安装npm yarn 配置 nvm 安装 nvm 是一个 node.js 管理工具,可以快捷下载安装使用多个版本的node.js linux 命令行输入: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bashwget -qO- https…

电子签名实名认证的必要性解析

电子签名是确保电子文件真实性和完整性的重要手段,而实名认证则是保证电子签名有效性的必要条件。在电子签名过程中,实名认证的作用主要体现在以下几个方面: 确认身份:实名认证能够确认签署者的真实身份,防止冒签、代…

SL1581降压恒压芯片 4V至30V降5V输出 电流2.4A 电路简单

SL1581降压恒压芯片是一款非常实用的电源管理芯片,它能够在4V至30V的输入电压范围内实现5V的稳定输出,同时最大输出电流可达2.4A。相比传统的线性降压电源,SL1581采用了开关电源的原理,因此其电路更加简单、高效和可靠。 在电路设…

决策树、随机森林可视化

分享一个Python可视化工具pybaobabdt,轻松对决策树、随机森林可视化,例如, 图怎么看:每一种颜色代表一个class,link的宽度表示从一个节点流向另一个节点的items数量。 安装 pip install pybaobabdt pip install pygra…

ESC云服务器使用

购买云服务器 选择CPU,内存,选择硬盘大小,选择系统购买。 我买的2C4G40G,用来使用docker部署应用。1个月费用100多点。 购买后,在控制台可以看到实例 远程连接 阿里云客户端 下载客户端,在控制台需要先创…

WPF入门到跪下 第十一章 Prism(一)数据处理

官网:https://primslibrary.com 源码地址:https://guthub.com/PrismLibrary/prism Prism是由微软发布、维护的开源框架,提供了一组设计模式的实现,有助于编写结构良好的且可维护的XAML应用程序,包括MVVM、依赖注入、命…

Android 拍照以及相册中选择(适配高版本)————上传头像并裁剪(一)

前言 在项目研发中,相信大家都遇到过给用户增加头像照片的需求。 随着手机版本的不断更新,android 8、android 9、android 10、android 12、android 13、鸿蒙系统等等;遇到这个功能需求,大家肯定会想,“这还不好写&…

一键AI智能改写,自动修改文章效率高

在当今信息爆炸的时代,写作成为了人们日常生活和工作中不可或缺的一部分。不论是学生写作业,还是职场人士起草报告,都需要投入大量的时间和精力来构思和修改文章。然而,随着科技的不断进步,一项新的技术正在改变着写作…

HTML111111111

在线编辑器 在线 HTML 空元素 没有内容的 HTML 元素被称为空元素。空元素是在开始标签中关闭的。 即使 在所有浏览器中都是有效的,但使用 其实是更长远的保障。 HTML 水平线 标签在 HTML 页面中创建水平线。 hr 元素可用于分隔内容。 HTML 折行 如果您希望…

免费的爬虫软件【2024最新】

在国际市场竞争日益激烈的背景下,国外网站的SEO排名直接关系到网站在搜索引擎中的曝光度和用户点击量。良好的SEO排名能够带来更多的有针对性的流量,提升网站的知名度和竞争力。 二、国外网站SEO排名的三种方法 关键词优化: 关键词优化是SEO…

Java基础面试题-2day

面向对象 创建一个对象用什么运算符,对象实体和对象引用有什么不同? 创建对象使用new String A new String(); A即为对象引用,通过new运算符,创建String()类型的对象实体。 对象引用的存储位置在栈内存 对象实体的存储位置在堆…

分布式事务Seata实战-AT模式(注册中心为Eureka)

大致记录Seata的AT模式下创建项目过程中需要注意的点和可能遇到的问题。 本项目是以官网的给的示例(即下图)进行创建的,以Eureka为注册中心。 官网:Seata AT 模式 | Apache Seata™ 官方代码示例: 快速启动 | Apac…

C++编写、生成、调用so库详解(一)

开发中经常会用到so库,大多是调用第三方的so库,偶尔也需要自己封装一个so库给别人调用,这边就记录一下开发so库的一个过程. 首先我们这边是在Android Studio中开发的,所以仅描述在Android环境下开发过程,当然也可以用其他工具开发. 目录 1.第一步新建项目,配置需要的工具 2…

MFTCoder 重磅升级 v0.3.0 发布,支持 Mixtral 等更多模型,支持收敛均衡,支持 FSDP

1. MFTCoder 简介 CodeFuse在2023年9月开源了一种多任务微调框架——MFTCoder,它可以实现在多个任务上同时并行地进行微调。通过结合多种损失函数,我们有效地解决了多任务学习中常见的任务间数据量不平衡、难易不一和收敛速度不一致等挑战。大量实验结果…
最新文章