浅谈对线程的理解

这篇具有很好参考价值的文章主要介绍了浅谈对线程的理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、线程的概念

1、线程的概念

在Python中,想要实现多任务还可以使用多线程来完成。

2、为什么使用多线程?

进程是分配资源的最小单位 , 一旦创建一个进程就会分配一定的资源 , 就像跟两个人聊QQ就需要打开两个QQ软件一样是比较浪费资源的 .

线程是<font color="red">程序执行的最小单位</font> , 实际上进程只负责分配资源 , 而利用这些资源执行程序的是线程 , 也就说进程是线程的容器 , 一个进程中最少有一个线程来负责执行程序 。同时线程自己不拥有系统资源,只需要一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程<font color="red">共享进程所拥有的全部资源</font> 。这就像通过一个QQ软件(一个进程)打开两个窗口(两个线程)跟两个人聊天一样 , 实现多任务的同时也节省了资源。

3、多线程的作用

def func_a():
    print('任务A')
​
​
def func_b():
    print('任务B')
​
​
func_a()
func_b()

☆ 单线程执行

☆ 多线程执行

二、多线程完成多任务

1、多线程完成多任务

① 导入线程模块
import threading
​
② 通过线程类创建线程对象
线程对象 = threading.Thread(target=任务名) 
​
② 启动线程执行任务
线程对象.start()
参数名 说明
target 执行的目标任务名,这里指的是函数名(方法名)
name 线程名,一般不用设置
group 线程组,目前只能使用None

2、线程创建与启动代码

单线程案例:

import time
​
​
def music():
    for i in range(3):
        print('听音乐...')
        time.sleep(0.2)
​
​
def coding():
    for i in range(3):
        print('敲代码...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    music()
    coding()

多线程案例:

import time
import threading
​
​
def music():
    for i in range(3):
        print('听音乐...')
        time.sleep(0.2)
​
​
def coding():
    for i in range(3):
        print('敲代码...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    music_thread = threading.Thread(target=music)
    coding_thread = threading.Thread(target=coding)
​
    music_thread.start()
    coding_thread.start()

3、线程执行带有参数的任务

参数名 说明
args 以元组的方式给执行任务传参
kwargs 以字典方式给执行任务传参
import time
import threading
​
​
def music(num):
    for i in range(num):
        print('听音乐...')
        time.sleep(0.2)
​
​
def coding(count):
    for i in range(count):
        print('敲代码...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    music_thread = threading.Thread(target=music, args=(3, ))
    coding_thread = threading.Thread(target=coding, kwargs={'count': 3})
​
    music_thread.start()
    coding_thread.start()

4、主线程和子线程的结束顺序

import time
import threading
​
​
def work():
    for i in range(10):
        print('work...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    # 创建子进程
    work_thread = threading.Thread(target=work)
    # 启动线程
    work_thread.start()
​
    # 延时1s
    time.sleep(1)
    print('主线程执行完毕')

☆ 设置守护线程方式一

import time
import threading
​
​
def work():
    for i in range(10):
        print('work...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    # 创建子线程并设置守护主线程
    work_thread = threading.Thread(target=work, daemon=True)
    # 启动线程
    work_thread.start()
​
    # 延时1s
    time.sleep(1)
    print('主线程执行完毕')

☆ 设置守护线程方式二

import time
import threading
​
​
def work():
    for i in range(10):
        print('work...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    # 创建子线程
    work_thread = threading.Thread(target=work)
    # 设置守护主线程
    work_thread.setDaemon(True)
    # 启动线程
    work_thread.start()
​
    # 延时1s
    time.sleep(1)
    print('主线程执行完毕')

5、线程间的执行顺序

for i in range(5):
    sub_thread = threading.Thread(target=task)
    sub_thread.start()

思考:当我们在进程中创建了多个线程,其线程之间是如何执行的呢?按顺序执行?一起执行?还是其他的执行方式呢?

答:线程之间的执行是无序的,验证

☆ 获取当前线程信息

# 通过current_thread方法获取线程对象
current_thread = threading.current_thread()
​
# 通过current_thread对象可以知道线程的相关信息,例如被创建的顺序
print(current_thread)

☆ 线程间的执行顺序

import threading
import time
​
def get_info():
    # 可以暂时先不加,查看效果
    time.sleep(0.5)
    current_thread = threading.current_thread()
    print(current_thread)
​
​
if __name__ == '__main__':
    # 创建子线程
    for i in range(10):
        sub_thread = threading.Thread(target=get_info)
        sub_thread.start()

总结:线程之间执行是无序的,是由CPU调度决定某个线程先执行的。

6、线程间共享全局变量

☆ 线程间共享全局变量

多个线程都是在同一个进程中 , 多个线程使用的资源都是<font color="red">同一个进程中的资源</font> ,因此多线程间是共享全局变量

示例代码:

import threading
import time
​
​
my_list = []
​
​
def write_data():
    for i in range(3):
        print('add:', i)
        my_list.append(i)
    print(my_list)
​
​
def read_data():
    print('read:', my_list)
​
​
if __name__ == '__main__':
    write_thread = threading.Thread(target=write_data)
    read_thread = threading.Thread(target=read_data)
​
    write_thread.start()
    time.sleep(1)
    read_thread.start()

7、总结:进程和线程对比

☆ 关系对比

① 线程是依附在进程里面的,没有进程就没有线程。

② 一个进程默认提供一条线程,进程可以创建多个线程。

☆ 区别对比

① 进程之间不共享全局变量

② 线程之间共享全局变量

③ 创建进程的资源开销要比创建线程的资源开销要大

④ 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位

☆ 优缺点对比

① 进程优缺点:

优点:可以用多核

缺点:资源开销大

② 线程优缺点

优点:资源开销小

缺点:不能使用多核文章来源地址https://www.toymoban.com/news/detail-846701.html

到了这里,关于浅谈对线程的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 浅谈对属性描述符__get__、__set__、__delete__的理解

    1.1 何为属性描述符? 属性描述符是一种Python语言中的特殊对象,用于定义和控制类属性的行为。属性描述符可以通过定义 __get__、__set__、__delete__ 方法来控制属性的读取、赋值和删除操作。 通过使用属性描述符,可以实现对属性的访问控制、类型检查、计算属性等高级功能

    2023年04月12日
    浏览(31)
  • 【软件工程】《软件工程》期末复习提纲

    《软件工程》期末复习提纲 第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 第九章 第十章 第十一章 第十二章 第十三章 第十四章 小题参考 大题参考 1.在下列选项中,( )不是软件的特征。 A.系统性与复制性         B.可靠性与一致性 C.抽象性与智能性  

    2024年01月17日
    浏览(35)
  • 【软件工程】软件工程习题及答案

    软件工程是一种系统化、规范化的方法论,用于开发、维护和管理软件项目。它涵盖了软件开发的各个方面,包括需求分析、设计、编码、测试、部署、维护和项目管理等。 软件工程通过应用科学原理、工程技术和管理方法,以及适应性的实践,旨在提高软件开发的效率、质

    2024年02月09日
    浏览(57)
  • 【软件工程】软件工程期末考试试卷

    瀑布模型把软件生命周期划分为八个阶段 :问题的定义、可行性研究、软件需求分析、系统总体设计、详细设计、编码、测试和运行、维护。八个阶段又可归纳为三个大的阶段: 计划阶段、开发阶段和( C) 。   A、详细计划 B、可行性分析  C 、 运行阶段  D、 测试与排错

    2024年02月09日
    浏览(39)
  • 【软件工程】软件工程期末考试复习题

    软件工程期末考试试题及参考答案 一、单向选择题 1、软件的发展经历了(D)个发展阶段。 一 二 三 四 2、需求分析的任务不包括(B)。 问题分析 系统设计 需求描述 需求评审。 3、一个软件的宽度是指其控制的(C)。 模块数 层数 跨度 厚度 4、当模块中包含复杂的条件组

    2024年02月10日
    浏览(39)
  • 【软件工程】山东大学软件工程复习提纲

    涵盖所有考点,复习绝对高效,点赞+留邮箱获取pdf版本 本提纲可以完全摘抄,考试命中率100%,先上考试带的A4纸: 1. 软件工程三要素 方法:为软件开发提供了“如何做 ”的技术,如项目计划与估算、软件系统需求分析、数据结构、系统总体结构的设计等; 工具:为软件工

    2024年02月13日
    浏览(31)
  • 【软件工程】为什么要选择软件工程专业?

    个人主页:【😊个人主页】 软件工程是一门研究用工程化方法构建和维护有效、实用和高质量的软件的学科。就当下主流趋势来看,其有着无限的未来。接下来我将以六个方面来谈谈我对软件工程专业的看法: 软件工程是一门研究用工程化方法构建和维护有效、实用和高质

    2023年04月19日
    浏览(35)
  • 【软件工程】自动化测试保证卓越软件工程能力(3)

    对照目标系统,如下:  给出自动化测试平台目标如下: Case level Case brief Report send to OVERALL User 1 - Process - Customer 1 Boss Level 1 User 1 - Process - Customer 1 User 1 - Process - Customer  2 User  2  - Process - Customer 1 ... Manager, Some users, Developers, Testers Level 2 User 1 - Igeress - Process - Router - Sender 1

    2024年02月04日
    浏览(46)
  • 经典软件工程复兴?大模型驱动的软件工程实践标准化

    简单来说,本文探讨了大模型驱动的软件工程实践标准化,以及如何将需求和设计规范化为 DSL 格式。通过这种方式,可以让 AI 更自动化、高效地编写代码。 随着大语言模型在软件开发中的应用越来越广泛,传统的软件工程实践开始被重新关注和提及。在诸如于编写清晰的文

    2024年02月12日
    浏览(30)
  • 【软件工程】软件测试

    软件=程序+文档 测试对象:各个阶段产生的源程序和文档。 基于不同的立场,对软件测试的目的存在着两种完全对立的观点。 (1)一种观点是通过测试暴露出软件中所包含的故障和缺陷(从用户的角度); (2)另一种是希望测试成为表明软件产品中不存在错误的过程,验证该

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包