【Python】多线程编程 ② ( 进程与线程 | 进程的内存空间 | 并行执行概念 | 线程的创建和执行 | threading.Thread() 函数解析 )

2023-07-27 14:49:28





一、进程与线程




1、进程的内存空间


在 操作系统 中 , 进程 之间 的 内存空间 是 隔离的 , 不同的进程 拥有各自的 内存空间 ,

这些内存空间 都从 0 开始计数 , 但是 这些 内存空间 只占总内存 的一小部分 ;


一个 进程 中 可以有若干 线程 , 这些 线程 共享 进程的 内存空间 ;


进程 只能 访问 操作系统 分配给自己的 内存空间 , 不能访问其它 进程 的 内存空间 ;

  • 下图中 , 进程 A 只能访问自己的内存 , 不能访问 进程 B 的内存 ;

在这里插入图片描述


2、线程之间的共享内存


一个 进程 中的 若干 线程 , 可以共享 进程 的 内存空间 ;

线程 只能 访问 本进程 的内存空间 , 不能访问 其它 进程的 内存空间 ;


3、并行执行概念


进程 之间 可以 并行执行 , 操作系统 中的 多个 进程 , 可以在 同一时间 做 不同的 工作 ;

线程 之间 可以 并行执行 , 进程 中的 多个线程 , 可以在 同一时间 做 不同的 工作 ;





二、Python 多线程编程




1、线程的创建和执行


所有的编程语言 都允许 多线程编程 , Python 也支持 多线程编程 ;

Python 多线程编程 功能 是由 threading 模块提供的 ;


在 Python 中 , 进行 多线程编程 ,

首先 , 需要导入 threading 模块 ;

import threading

然后 , 执行 threading.Thread() 方法 , 创建 线程实例对象 ;

thread_obj = threading.Thread()

最后 , 调用 线程对象#start() 函数 , 启动线程 ;

thread_obj.start()

2、threading.Thread() 函数解析


threading.Thread() 函数 用于创建一个新的线程对象 , 并可以通过指定线程函数和参数来配置线程的行为 ;


threading.Thread 函数原型如下 :

threading.Thread(target=None, args=(), kwargs={})
  • target 参数 : 线程中要执行的函数 , 指定线程在启动后要执行的操作 , 默认值为 None ;
  • args 参数 : 类型为元组 , 包含传递给线程函数的参数 , 默认为 () 空元组 , 元素不可更改 ;
  • kwargs 参数 : 类型为字典 , 包含传递给线程函数的关键字参数,默认为 {} 空字典 ;

创建线程对象后会返回 线程 实例对象 , 可以调用 线程 实例对象 的 start() 方法 启动线程 ;

线程启动后 , 将在后台独立执行 , 并且可以 在进程中 与 进程中的其他线程 并行运行 ;


3、代码示例 - 线程创建运行


在下面的代码中 ,

首先 , 定义了一个名为 hello 的函数作为线程函数,

然后 , 调用 threading.Thread() 函数创建了一个新的线程实例对象 ,

通过 target=hello 关键字指定线程执行的是 hello 函数 ,

通过 kwargs 关键字指定 hello 函数的参数 , name 参数值为 " Tom " 字符串 , age 参数值为 18 数字类型 ,

kwargs={"name": "Tom", "age": 18}   # 指定关键字参数

再后 , 调用 函数实例对象 的 start() 方法启动线程 ;

最后,主线程继续执行其他操作 ;


代码示例 :

"""
多线程 代码示例
"""

import threading


# 线程中要执行的函数
def hello(name: str, age: int):
    print(f"Hello {name}, {age} years old") # 输出: Hello Tom, 18 years old


# 创建线程对象
thread_obj = threading.Thread(
    target=hello,                       # 指定线程中要执行的函数
    kwargs={"name": "Tom", "age": 18}   # 指定关键字参数
)

# 启动线程
thread_obj.start()

# 主线程继续执行其他操作
print("继续执行后续操作")

执行结果 :

D:\001_Develop\022_Python\Python39\python.exe D:/002_Project/011_Python/HelloPython/Hello.py
Hello Tom, 18 years old
继续执行后续操作

Process finished with exit code 0

在这里插入图片描述


4、代码示例 - 线程并行运行


在下面的代码中 ,

首先 , 定义了两个函数 , 这两个函数都需要长时间才能执行完毕 ;

# 线程中要执行的函数 1
def sing():
    for i in range(3):
        print(f"{i} 唱歌")
        time.sleep(1)


# 线程中要执行的函数 2
def dance():
    for i in range(3):
        print(f"{i} 跳舞")
        time.sleep(1)

然后 , 创建两个线程 , 分别执行上述两个函数 ;

    # 创建唱歌线程
    thread_sing = threading.Thread(target=sing)
    # 创建跳舞线程
    thread_dance = threading.Thread(target=dance)

最后 , 启动两个线程 , 两个线程的命令行输出内容交替打印出来 ;

    # 执行线程
    thread_sing.start()
    thread_dance.start()

代码示例 :

"""
多线程代码示例
"""

import time
import threading


# 线程中要执行的函数 1
def sing():
    for i in range(3):
        print(f"{i} 唱歌")
        time.sleep(1)


# 线程中要执行的函数 2
def dance():
    for i in range(3):
        print(f"{i} 跳舞")
        time.sleep(1)


if __name__ == '__main__':
    # 创建唱歌线程
    thread_sing = threading.Thread(target=sing)
    # 创建跳舞线程
    thread_dance = threading.Thread(target=dance)

    # 执行线程
    thread_sing.start()
    thread_dance.start()

执行结果 :

D:\001_Develop\022_Python\Python39\python.exe D:/002_Project/011_Python/HelloPython/Hello.py
0 唱歌
0 跳舞
1 跳舞1 唱歌

2 唱歌2 跳舞


Process finished with exit code 0

在这里插入图片描述

更多推荐

【腾讯云国际站】CDN内容分发网络特性介绍

为什么使用腾讯云国际站CDN内容分发网络?当用户直接访问源站中的静态内容时,可能面临的体验问题:客户离服务器越远,访问速度越慢。客户数量越多,网络带宽费用越高。跨境用户访问体验较差。腾讯云国际站CDN如何改善您的网络体验:腾讯云国际站CDN缓存内容后,用户仅需要访问就近的CDN节点即可获取静态内容。缓解源站带宽压力,网

实现AIGC更好的数据存力,这家科技巨头为我们指明了方向

存力即数据存储能力蕴藏着巨大的发展机会【全球存储观察|热点关注】2023年,全球被ChatGPT的热潮席卷,拥抱AIGC的创新赛道成为众多企业的新选择。全球存储观察分析指出,影响AIGC发展的三大因素也日益凸显,即算力、存力与运力,算力即计算能力;存力即数据存储能力;运力即网络运载能力。而其中令业界越来越重视的存力,蕴

Linux——Shell脚本编程(2)

一、Shell变量LinuxShell中的变量分为,系统变量和用户自定义变量(这个用的比较多)。系统变量:$HOME、$PWD、$SHELL、$USER等等,比如:echo$HOME等等..显示当前shell中所有变量:set举例说明:二、设置环境变量记得在注释的时候,内容单独放在一块。位置参数变量注意此处的脚本中,确

【C#源码】医院检验信息管理系统LIS LIS源码

LIS检验系统包含检验科各部门工作和管理需求及其它实验室检验的相应事务,具有检验单申请、付费,标本采集、接收、传输、处理、分注、分类(按项目分类)、检测的自动化流水作业,检验结果自动分析,检验数据自动传输、手工输入,检验结果审核的辅助处理,室内质量控制完善执行,分析后标本贮存管理,病人、医生方便获得检验单等基本功能,并

【2023】Git版本控制-本地仓库详解

目录1.Git是什么?它能做什么?2.安装Git3.Git版本管理3.1.Git初始化(创建仓库)3.2.提交代码3.3.代码回退3.4.代码恢复4.分支4.1.创建分支4.2.在分支上提交任务4.3.合并分支4.4.删除分支1.Git是什么?它能做什么?Git是一个分布式版本控制系统,它主要用于跟踪和管理软件项目的源

如何选择服务器?服务器选择方法

选择适合的服务器需要考虑多个因素,包括预期的工作负载、性能需求、可扩展性、安全性和预算等。以下是一些常见的方法和考虑因素,可帮助您选择适合的服务器:确定工作负载:首先要了解服务器将用于什么样的工作负载。是用于网站托管、数据库管理、文件存储还是其他特定的应用程序?不同的工作负载对服务器的要求不同,例如处理高流量的网站可能

基于SSM的北京集联软件科技有限公司信息管理系统

末尾获取源码开发语言:JavaJava开发工具:JDK1.8后端框架:SSM前端:采用JSP技术开发数据库:MySQL5.7和Navicat管理工具结合服务器:Tomcat8.5开发软件:IDEA/Eclipse是否Maven项目:是目录一、项目简介二、系统设计系统概要设计系统功能结构设计三、系统项目截图用户管理公告管

软考考试多少分算通过?

软考证书取得需要达到总分45分,每门科目满分为75分。因此,不要小看45分,在考试中获得这个分数并不容易。此外,软考要求一次性通过,如果没有通过,成绩将不被保留。因此,必须在一次考试中成功通过所有科目,否则就需要重新参加考试。如果考生只通过了其中一门,而另一门没能通过,就需要面对重新参加考试的情况。因此,建议考生在选择

一文了解语音合成技术(TTS)

TTS是TextToSpeech的缩写,即“从文本到语音”。它将计算机自己产生的、或外部输入的文字信息转变为可以听得懂的、流利的汉语口语(或者其他语言语音)输出的技术,隶属于语音合成(SpeechSynthesis)。语音,在人类的发展过程中,起到了巨大的作用。语音是语言的外部形式,是最直接地记录人的思维活动的符号体系

python链接数据库并创建/删除/插入多个数据库/表/表数据

嗨喽,大家好呀~这里是爱看美女的茜茜呐👇👇👇更多精彩机密、教程,尽在下方,赶紧点击了解吧~python源码、视频教程、插件安装教程、资料我都准备好了,直接在文末名片自取就可importpymysqll链接数据库并执行sql语句conn=pymysql.connect(host='10.245.251.61',us

Windows配置python(anaconda+vscode方案)的主要步骤及注意事项

Windows配置python(anaconda+vscode方案)的主要步骤及注意事项1、准备工作anaconda,官网下载(直接下载最新版)vscode,官网下载(官网直接下载有可能太慢,可以考虑在国内靠谱的网站上下载)PS:windows上也完全可以直接使用miniforge或者miniconda,安装配置方法完

热文推荐