Chapter 39 Python多线程编程

news2024/9/23 3:31:40

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!

文章目录

  • 前言
  • 一、并行执行
  • 二、threading模块


前言

现代操作系统如 macOS、UNIX、Linux 和 Windows 等,均支持多任务处理。本篇文章详细讲解了并行执行的概念以及如何在 Python 中利用 threading 模块实现多线程编程。


本篇文章参考:黑马程序员

一、并行执行

①进程
进程是计算机程序的一次执行实例,是操作系统对正在运行的程序所分配的资源的集合。每个进程都有自己的内存空间、系统资源和执行状态。在操作系统中,进程是资源调度和管理的基本单位。一个进程可以包含多个线程。

②线程
线程是进程中的一个执行单元,是操作系统进行 CPU 调度的最小单位。一个进程可以由多个线程组成,它们共享进程的资源,如内存和文件描述符。在同一进程中的线程之间可以直接通信。

通俗来讲,进程就好比一家公司,是操作系统对程序进行运行管理的单位;线程就好比公司的员工,是进程实际的工作者,并且一个进程(公司)可以有多个线程(员工)。

③并行执行
并行执行是指在同一时间内进行不同的工作
多个进程可以在操作系统中同时运行,即使在单核处理器上,进程之间也会通过时间片轮转等机制实现并行效果。
而在一个进程内部,多线程的执行更是可以帮助我们实现真正的并行操作,比如一个Python程序可以做到一个线程在输出“你好”,另一个线程在输出“Hello”,像这样一个程序在同一时间做两件乃至多件不同的事情, 我们就称之为多线程并行执行。

操作系统中可以运行多个进程,即多任务运行。
一个进程内可以运行多个线程,即多线程运行。

【注意】

  • 进程之间是内存隔离的, 即不同的进程拥有各自的内存空间。 这就类似于不同的公司拥有不同的办公场所。
  • 线程之间是内存共享的,线程是属于进程的,一个进程内的多个线程之间是共享这个进程所拥有的内存空间的。 这就类似于公司员工之间是共享公司的办公场所。

在这里插入图片描述

二、threading模块

大多数现代编程语言都支持多线程编程,Python 也不例外。Python 提供了 threading 模块来实现多线程操作,其基本的使用方法如下:
①导入threading模块

import threading  

②定义线程要执行的函数

def thread_function():  
    # 线程执行的任务  
    pass

③创建线程对象
thread_obj = threading.Thread([group [, target [, name [, args [, kwargs]]]]]

  • group:暂时无用,未来功能的预留参数
  • target:执行的目标任务名
  • name:线程名,一般不用设置
  • args:以元组的方式给执行任务传参
  • kwargs:以字典方式给执行任务传参

④启动线程
thread_obj.start()

【示例】

import time
def sing():
    while True:
        print("在唱歌")
        # 等待 1 秒
        time.sleep(1)

def dance():
    while True:
        print("在唱歌")
        # 等待 1 秒
        time.sleep(1)

if __name__ == '__main__':
    sing()
    dance()

运行后会一直输出“在唱歌”

输出结果:
在唱歌
在唱歌
在唱歌
……

【分析】
在这段代码中,sing() 在主线程中运行,由于while True:永远为真,sing() 会无限循环,程序会一直在这个循环中执行。因此,dance() 函数永远不会被调用,运行后会一直输出“在唱歌”。

import time
import threading

def sing():
    while True:
        print("在唱歌")
        time.sleep(1)

def dance():
    while True:
        print("在跳舞")
        time.sleep(1)

if __name__ == '__main__':
    # 创建一个新的线程,其目标函数为 sing
    sing_thread=threading.Thread(target=sing)
    # 创建另一个线程,其目标函数为 dance
    dance_thread=threading.Thread(target=dance)

    # 启动线程
    sing_thread.start()
    dance_thread.start()

输出结果:
在唱歌
在跳舞
在唱歌
在跳舞
……

【分析】
在这段代码中,sing 和 dance 函数分别代表两个独立的线程。它们在同一时间内向控制台输出信息,实现了并行执行。

若需给线程传递参数,可以使用 args 和 kwargs形参:

  • args:以元组的方式给执行任务传参
  • kwargs:以字典方式给执行任务传参

【示例】

import time
import threading

def sing(msg):
    while True:
        print(msg)
        time.sleep(1)

def dance(msg):
    while True:
        print(msg)
        time.sleep(1)

if __name__ == '__main__':
    # 创建一个唱歌的线程
    # 传入元组(元组是用逗号区分的,当只有一个元素时,需要在其后面加逗号)
    sing_thread=threading.Thread(target=sing,args=("在唱歌",))
    # 创建一个跳舞的线程
    dance_thread=threading.Thread(target=dance,kwargs={"msg":"在跳舞"})

    # 启动线程
    sing_thread.start()
    dance_thread.start()

输出结果:
在唱歌
在跳舞
在唱歌
在跳舞
……

在这个例子中,sing 函数和 dance 函数各自接受消息参数,实现了更灵活的输出功能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苍穹外卖-day03(SpringBoot+SSM的企业级Java项目实战)

苍穹外卖-day03 课程内容 公共字段自动填充 新增菜品 菜品分页查询 删除菜品 修改菜品 功能实现:菜品管理 菜品管理效果图: 1. 公共字段自动填充 1.1 问题分析 在上一章节我们已经完成了后台系统的员工管理功能和菜品分类功能的开发&#xff0c…

本地ComfyUI安装全记录

资料 先看我写的stable diffusion全记录 ComfyUI 完全入门:安装部署 ComfyUI 完全入门:图生视频 ComfyUI【强烈推荐】 秋葉aaaki comfy UI整合包 可以使用stable diffusion的大模型,通过修改文件重新指向 修改路径即可 下载秋叶大佬的…

Linux 实操-权限管理:深入了解rwx的作用

😀前言 本篇博文是关于Linux文件权限管理的基本知识和实际操作,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是…

git rebase 重建清爽的历史提交

前言 在代码评审时遇到分支上有多个commit信息,对于评审者来说是非常头疼的,因为太混乱了。遇到这样的情况,就需要让开发人员把commit压缩一下,简单来说就是将多个commit合并为一个,这样看起来就比较整洁了&#xff0…

【颠覆传统!】SmartEDA引领潮流:在线实时仿真,Multisim与Proteus望尘莫及的新纪元!

在电子设计自动化的浩瀚星空中,两款老牌软件——Multisim与Proteus,如同璀璨星辰,长久以来照亮了工程师们的设计之路。它们以强大的仿真功能和丰富的元件库,赢得了无数设计者的青睐。然而,时代的车轮滚滚向前&#xff…

关于FreeRTOS使用相关API函数导致程序阻塞的问题

前言: 如题。近日在给项目移植FreeRTOS的时候,发现调用如下API函数会阻塞: xTaskNotifyGive(xTaskGetHandle(Task_PrintCtrl_attributes.name)); 首先猜测可能是xTaskGetHandle有问题导致。通过printf打印调试信息,发现执行xTask…

乐凡三防平板定制:为行业量身打造的移动解决方案

在数字化转型的大潮中,移动设备成为企业提升效率、优化流程的关键工具。三防平板,以其坚固耐用、适应恶劣环境的特性,成为工业、物流、建筑、军事等领域不可或缺的选择。而三防平板的定制化服务,则进一步满足了不同行业对设备性能…

Linux | Linux进程万字全解:内核原理、进程状态转换、优先级调度策略与环境变量

目录 1、从计算机组成原理到冯诺依曼架构 计算机系统的组成 冯诺依曼体系 思考:为什么计算机不能直接设计为 输入设备-CPU运算-输出设备 的结构? 2、操作系统(Operator System) 概念 设计OS的目的 描述和组织被管理对象 3、进程 基本概念 进程id和父进程…

亲测好用,吐血整理 ChatGPT 3.5/4.0 新手使用手册~

废话不多说,直接分享正文~ 以下是小编为大家搜集到的最新的ChatGPT国内站,各有优缺点。 1、AI Plus(稳定使用) 推荐指数:⭐⭐⭐⭐⭐ yixiaai.com 该网站已经稳定运营了1年多了。2023年3月份第一批上线的网…

linux网络配置脚本

通过脚本&#xff0c;设置静态ip以及主机名 因为企业9的网络配置文件和企业7的不一样所以&#xff0c;我们以rhel9和rhel7为例 rhel7/centos7/openeuler #!/bin/bash cat > /etc/sysconfig/network-scripts/ifcfg-$1 << EOF DEVICE$1 ONBOOTyes BOOTPROTOnone IPAD…

数据埋点系列 14|跨平台和多源数据整合:构建全面数据视图的策略与实践

在当今复杂的数字生态系统中&#xff0c;组织的数据通常分散在多个平台和来源中。有效整合这些数据不仅可以提供全面的业务洞察&#xff0c;还能支持更准确的决策制定。本文将探讨如何实现跨平台和多源数据的有效整合。 目录 1. 数据整合的重要性2. 数据整合的挑战3. 数据整合…

695. 岛屿的最大面积(中等)

695. 岛屿的最大面积 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;695. 岛屿的最大面积 2.详细题解 该题是典型的深度优先搜索题&#xff0c;深度优先搜索的基本思想是&#xff1a;从某个节点出发&#xff0c;尽可能深地搜索图的分支…

Redis未授权访问漏洞利用合集

一、基本信息 靶机&#xff1a;IP:192.168.100.40 攻击机&#xff1a;IP:192.168.100.60 二、漏洞 & 过程 Redis 未授权访问漏洞利用无口令远程登录靶机 靶机 cd redis-4.0.8/src./redis-server ../redis.conf 攻击机 ./redis-cli -h 192.168.100.40 Redis 未授权访问…

删除微博博文js脚本实现

我当前的时间&#xff1a;2024.8.18 脚本可以直接使用&#xff0c;随着时间推移&#xff0c;微博页面元素可能会有变动。 思路&#xff1a;javascript 模拟手动点击&#xff0c;下滑&#xff0c;并且删除博文 首先登录微博&#xff0c;进入自己的博文界面如下&#xff1a; 进…

数据结构08--排序及查找

1.基本概念 排序是处理数据的一种最常见的操作&#xff0c;所谓排序就是将数据按某字段规律排列&#xff0c;所谓的字段就是数据节点的其中一个属性。比如一个班级的学生&#xff0c;其字段就有学号、姓名、班级、分数等等&#xff0c;我们既可以针对学号排序&#xff0c;也可以…

c++ opencv开发环境搭建

打开opencv官网&#xff0c;OpenCV - Open Computer Vision Library 然后点击之后&#xff0c;下载即可&#xff0c;下载完成之后&#xff0c;点击安装&#xff0c;等待安装完毕。 这是安装完毕之后的目录&#xff0c;已经包含了头文件与lib库、dll等&#xff0c;开发之前的环境…

RK3568平台(触摸篇)主板端集成厂家触摸屏

一.硬件连接 板卡配触摸框架构如下图&#xff1a; 二.数据流向 板卡配触摸框的数据流向&#xff0c;尽量做到高灵活性&#xff0c;并且简单清晰&#xff1a; 1&#xff09;后台进程从触摸框获取原始数据并计算&#xff0c;计算的点报给 android 内核 input 系统&#xff0c…

【AI/算法类】OPPO 2025届秋招笔试题(B卷)

目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间&#xff1a;2024/08/10 &#x1f504; 输入输出&#xff1a;ACM格式 ⏳ 时长&#xff1a;2h 本试卷还有选择题部分&#xff0c;但这部分比较简单就不再展示。 1. 第一题 小O有一个正整数 x x x&#xff0c;他想知道&#xff0c;第…

【机器学习】(基础篇五) —— 逻辑回归

逻辑回归 逻辑回归&#xff08;Logistic Regression&#xff09;是一种广义线性模型&#xff0c;主要用于处理因变量为二分类或多分类&#xff08;通过独热编码或多输出逻辑回归&#xff09;的问题。尽管名字中带有“回归”二字&#xff0c;但实际上逻辑回归是一种分类算法&am…

SQLite数据库的增删改查(CRUD)

文章目录 SQLite数据库的增删改查&#xff08;CRUD&#xff09;添加数据更新数据删除数据查询数据使用SQL操作数据库添加数据的方法如下&#xff1a;更新数据的方法如下&#xff1a;删除数据的方法如下&#xff1a;查询数据的方法如下&#xff1a; SQLite数据库的增删改查&…