并发编程之线程、多线程

并发编程和多线程 文章目录并发编程和串行并发编程的目的:适合并发编程的场景并发编程的挑战之--频繁的上下文切换并发编程的挑战之--死锁并发编程的挑战--线程安全并发编程的挑战--资源的限制线程基础线程和进程的区别线程的状态及相互转换线程创建线程的挂起和恢复操作线程的中断操作(interrupt)线程的优先级守护线程 并发编程和串行 并发编程的目的: 让程序充分利用非计算机资源·、 加快程序响应速度(耗时任务、we... 阅读详情

线程

线程介绍

​**进程是资源分配的最小单位,线程是CPU调度的最小单位。每一个进程中至少有一个线程。**主进程里面的线程称为主线程,其他进程中的线程称为子线程。

​ 在多线程的操作系统中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。并且线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故线程的切换非常迅速且开销小(在同一进程中的)。

​ 在同一进程中的各个线程,都可以共享该进程所拥有的资源,主要表现在:所有线程都具有相同的进程id,这意味着,线程可以访问该进程的每一个内存资源;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。

​ 在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工作的能力。

开启线程

​ 在Python中,如果要开启线程,则需要用到threading模块下的Thread类。具体的开启过程与进程类似,下面我们通过代码来看看:

方式一:

# 导入创建线程对象的类
from threading import Thread

def write():
    with open('a.txt', 'w', encoding='utf-8') as f:
        f.write('hello')

if __name__ == '__main__':
    t = Thread(target=write, )
    t.start()

方式二:

from threading import Thread
import time
class Sayhi(Thread):
    def __init__(self,name):
        super().__init__()
        self.name=name
    def run(self):
        time.sleep(2)
        print('%s say hello' % self.name)


if __name__ == '__main__':
    t = Sayhi('nick')
    t.start()
    print('主线程')
进程和线程的区别

​ 进程与线程之间的差别主要在于以下几点:

  • 地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见;
  • 调度和切换:线程上下文切换比进程上下文切换要快得多;
  • 进程的开销远远大于线程的开销;
  • 进程能利用多核优势的,而线程不能利用多核优势,但是可以开启多个进程,然后在进程里面再开启线程;
  • 进程之间是数据隔离的,而同一进程之间的多个线程之间的数据是不隔离的。
Thread类中的方法

Thread实例对象的方法:

  • isAlive():返回线程是否活跃。
  • getName():返回线程名。
  • setName():设置线程名。

threading模块提供的一些方法:

  • threading.currentThread():返回当前的线程变量。
  • threading.enumerate():返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
  • threading.activeCount():返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

下面我们通过代码进行简单演示:

from threading import Thread

def write():
    with open('a.txt', 'w', encoding='utf-8') as f:
        f.write('hello')
    print(threading.currentThread())

if __name__ == '__main__':
    t = Thread(target=write, )
    t.start()

    # print(t.is_alive())
    # print(t.getName()) # 返回线程名
    # t.setName('aaaaaaa')
    # print(t.getName())
    # print(threading.currentThread())
多线程实现socket
import multiprocessing
import threading

import socket
# socket.AF_INET 指的是基于网络类型的套接字家族
# AF_UNIX 指的是基于文件类型的套接字家族
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('127.0.0.1',8080))
s.listen(5)

def action(conn):
    while True:
        data=conn.recv(1024)
        print(data)
        conn.send(data.upper())

if __name__ == '__main__':

    while True:
        conn,addr=s.accept()
        p=threading.Thread(target=action,args=(conn,))
        p.start()
GIL锁(全局解释器锁)

​ Python代码的执行由Python虚拟机(也叫解释器主循环)来控制。Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行。虽然 Python 解释器中可以“运行”多个线程,但在任意时刻只有一个线程在解释器中运行。对Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。

在多线程环境中,Python 虚拟机按以下方式执行:

  1. 设置 GIL;
  2. 切换到一个线程去运行;
  3. 运行指定数量的字节码指令或者线程主动让出控制(可以调用 time.sleep(0));
  4. 把线程设置为睡眠状态;
  5. 解锁 GIL;
  6. 再次重复以上所有步骤。

注意:

  • 我们写的代码其实是解释器在执行,常见的有:cpython解释器、pypy解释器 …
  • GIL锁只存在于cpython解释器中,而其他解释器中不存在

实例:当我们开启一个垃圾回收的线程,再开启一个正常执行代码的线程,当垃圾回收线程还没有把垃圾回收完毕的时候,会出现抢占资源的情况,这是我们就需要拿到GIL锁,要想让线程能够正常执行,则该线程就必须拿到GIL锁。这样就保证了在同一时刻,只有一个线程在执行。

补充:该如何选择是使用线程还是进程?

答:对于i/o密集型,不需要计算,一般不消耗CPU,所以就选择线程比较好;而对于计算密集型,需要消耗CPU,所以尽量选择使用进程。

Java 多线程与并发编程全面指南 Java 作为一门成熟的企业级编程语言,提供了丰富的多线程与并发编程支持,使开发者能够构建高性能、高并发的应用程序。然而,多线程编程也带来了复杂性,包括线程安全、死锁、竞态条件等问题。本文将全面介绍 Java 多线程与并发编程的各个方面。 阅读详情

相关推荐

Java 并发编程与多线程

Java 并发编程和多线程是高级开发中的一个重要部分,涉及多线程的创建、线程协同、线程安全、性能优化、并发工具等内容。

1224

【并发】一文搞懂多线程和并发编程

线程是CPU调度和执行的最小单位,一个进程可以拥有一个或多个线程。 在一个进程中,如果开辟了多个线程,线程的运行将由CPU调度器来安排。 在单核CPU下,即使用了多线程,在同一个时间点,CPU只能执行单个线程的代码,因为线程之间切换的很快,所以就感觉多个线程是在同时做一件事。 这种现象也叫做并发。......

yang553566463的博客 1391

MySQL表名大小写敏感问题终极解决:lower_case_table_names=1不生效的3个隐藏坑

本文深入剖析了MySQL表名大小写敏感问题中,设置lower_case_table_names=1参数不生效的三个核心原因。关键在于理解该参数只能在数据库初始化前设置,并需排查配置文件优先级与正确停止服务的顺序。文章提供了从Windows迁移到Linux的完整避坑指南与验证方法,帮助DBA和开发者彻底解决这一跨平台兼容性难题。

weixin_29229055的博客 391

多线程与并发编程【多线程与并发编程、 进程、线程的区别、 线程的创建】(一)-全面详解(学习总结---从入门到深化)

多线程与并发编程【多线程与并发编程、 进程、线程的区别、线程的创建】(一)-全面详解(学习总结---从入门到深化)

607

AD2S1210与DSP28335 SPI通信中的GPIO配置陷阱与解决

本文深入剖析了AD2S1210与DSP28335进行SPI通信时,因GPIO输入限定配置不当导致数据整体右移的典型问题。文章指出,错误地将MISO引脚配置为带采样周期的同步模式是根本原因,并提供了将输入选择限制正确设置为异步模式的解决方案。同时,总结了不同应用场景下GPIO输入限定的配置原则,为高速同步通信的稳定实现提供了关键指导。

weixin_29163857的博客 146

COCO2017数据集类别分布深度解析

本文深入解析了COCO2017数据集的类别分布情况,包括80个常见物体的分类统计和样本数量分析。通过对比训练集与验证集的分布一致性,探讨了数据均衡性问题,并针对高频和低频类别提出了实用的数据预处理和模型训练建议,帮助优化计算机视觉任务的性能。

weixin_42533751的博客 370

多线程和并发的区别

    并发与多线程之间的关系就是目的与手段之间的关系。    并发(Concurrent)的反面是串行,串行好比多个车辆行驶在一股车道上,它们只能“鱼贯而行”。而并发好比多个车辆行驶在多股车道上,它们可以“并驾齐驱”。并发的极致就是并行(Parallel)。多线程就是将原本可能是串行的计算“改为”并发(并行)的一种手段、途径或者模型。    因此,有时我们也称多线程编程为并发编程。当然,目的与手...

勿念先生的博客 5565

CANOe实战指南 - 从入门到精通的全流程解析

本文是CANOe实战指南,全面解析从入门到精通的全流程。内容涵盖CANOe软件的核心功能仿真、测试与分析,详细指导安装配置、工程创建、CAN信号收发、UDS诊断通信、CAPL自动化编程以及Panel面板设计。通过实战案例,帮助汽车电子工程师快速掌握这一行业标杆工具,构建自动化测试环境,提升开发与测试效率。

pear55的博客 574

多线程和并发、多线程编程

线程函数是线程执行的入口点。它应该接受一个指向void的指针作为参数,并返回一个void指针。c复制代码// 线程执行的代码。

wssc63262的博客 1610

【AVRCP】规范精讲[19]: 媒体属性全解析,让你的蓝牙设备显示完整歌曲信息

AVRCP协议中的媒体属性是蓝牙音频设备传输歌曲元数据的关键,包含标题、艺术家、专辑等32位ID标识的键值对信息。规范要求字符串属性必须使用UTF-8编码,但乱码问题频发(如中文显示异常),主因是设备未遵循编码标准或使用GBK等非规范格式。常见问题包括信息不全(仅显示标题)、封面缺失(因带宽限制或格式不支持)及更新延迟(通知机制未启用)。解决方案包括强制UTF-8编码、优化封面大小(如300x300像素JPEG)、主动请求缺失属性。Android示例代码展示了通过广播接收器解析媒体属性的方法。

byte轻骑兵的技术小窝 1万+

【FPGA教程案例37】通信案例7——基于FPGA的FFT,IFFT傅里叶变换和逆变换

关于FFT和IFFT的相关描述,在上一课程我们已经有所了解,本课程不再重复。在上一课程,我们初步掌握了如何通过FFT对输入信号进行频谱分析,在本课程,我们将学习如何通过FPGA实现FFT和IFFT得到初始信号的过程。关于FFT的IP核配置,和上一课程相同。下面直接介绍其verilog调用过程。我们可以看到,IFFT的配置非常简单,在FFT的基础上,只需要将该参数的最后一位改为0,就可以实现IFFT变化。下面我们通过testbench文件,同时调用FFT和IFFT实现信号的傅里叶变换和逆变换。......

FPGA/MATLAB学习教程/源码/项目合作开发 4517

Python并发编程之多线程

本文介绍并发编程中另一个重要的知识 - 线程。我们知道一个程序的运行过程是一个进程,在操作系统中每个进程都有一个地址空间,而且每个进程默认有一个控制线程,打个比方,在一个车间中有很多原材料通过流水线加工产品,而线程就是这个车间中的流水线,而这个车间就是进程,原材料就是内存中的数据,每个车间至少有一条流水线。因此,进程只是将资源(原材料)集中到一起是资源单位,线程才是CPU具体的执行单位,一个进程中可以存在多个线程,这多个线程会共享该进程内的所有资源,因此同一个进程内开启多线程会产生资源争抢。

weixin_71807218的博客 2231

大数据分析案例-基于决策树算法构建世界杯比赛预测模型

本项目旨在分析往届世界杯比赛数据,找出规律,最后使用决策树算法构建世界杯比赛预测模型,给出两个球队即可预测胜率,可以给爱看球的小伙伴提供一个参考。本次实验我们使用了2018年及其之前的世界杯比赛数据,通过建立决策树模型,模型准确率为82%,接着我们使用该模型预测了2022年世界杯的5场半决赛及决赛,模型准确率也是接近80%的,说明模型效果还是很不错的。心得与体会:通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。

m0_64336780的博客 1万+

多线程与并发编程技术

并行与并发概念并行与并发概念在软件开发领域,特别是在构建高性能、高效率的应用程序时,并行和并发这两个词经常被提及。虽然它们在日常对话中通常可以互换使用,但其实并行和并发有着本质的区别,并且在理解多线程编程时非常重要。并行(Parallelism)并行编程是指通过同时执行多个任务来提高系统性能的一种技术。这里的同时指的是不同的处理单元(如处理器核心、GPU等)或相同的处理单元在同一时间内处理不同的数据流。并行编程依赖于硬件资源,例如多核处理器,使得能够同时处理多个任务,从而加速计算过程。

QT性能优化QT原理源码QT界面美化 1354

Microsoft Bitlocker企业级管理部署方案

BitLocker是Windows 10以及更高版本中内置的磁盘加密工具,是一种可靠的数据保护机制,可以保护计算机上的敏感数据不被未经授权的人访问。BitLocker的工作原理是将整个系统卷或其他数据卷加密的同时,向某个可信软件或硬件模块请求密钥解密数据。BitLocker最大的好处在于其内置于Windows系统,所以用户无需安装其他软件或购买额外的许可证或硬件设备。本文将介绍Microsoft BitLocker企业级管理部署方案,包括:BitLocker部署前的准备工作。

xueyunshengling的博客 2075

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Python并发编程——多线程

为了提升程序运行速度可以引入多线程、多进程、多协程和异步IO,是指I/O在很短的时间就可以完成,CPU需要大量的计算和处理,其特点是CPU占用率相当高,例如:压缩解压缩、加密解密、正则表达式搜索;是系统运作大部分的状况是CPU在等I/O(硬盘/内存)的读/写操作,CPU占用率很低,例如:文件处理程序、网络爬虫程序、读写数据库程序;

霖hero 1135

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java多线程并发编程技术详解

Java多线程并发编程是一项需要深入理解和熟练掌握的技术,只有合理地设计和使用多线程,才能真正发挥其在提升系统性能方面的巨大潜力。随着对Java并发机制及工具类库的深入学习和应用,开发者可以更好地构建高效、稳定的并发系统。

聚焦于深度解析最新的编程语言特性、框架升级、架构设计、开发工具和最佳实践,涵盖Web前端(如Vue3, React, Angular等)、后端开发(如Node.js, Java, Python等)、移动端开发(iOS, Android原生及跨平台开发) 3万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深入理解多线程并发编程

多线程并发编程的领域知识体系比较庞大,底层涵盖了CPU,内存,操作系统等多方面的内容,基于我目前掌握的知识和篇幅限制,不可能深入到每一个细节。本文旨在和大家一起探讨、研究多线程并发编程中的问题及其解决方案。本文受众主要是对多线程编程技术已经有一定使用经验或正在学习多线程编程的同学。文章分三个章节给大家展开,第一节是提出多线程编程要解决哪些核心问题。第二节讲这些问题背后的本质和原理。第三节讲如何使用C#语言提供的API进行多线程并发编程。

AndyT的博客 2061

多线程--JUC并发编程

多线程、并发相关知识点

weixin_45690338的博客 2095

多线程-并发编程

基础知识 并发编程的优缺点为什么要使用并发编程(并发编程的优点) 充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU 的计算能力发挥到极致,性能得到提升 方便进行业务拆分,提升系统并发能力和性能:在特殊的业务场景下,先天的就适合于并发编程。现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分 。 并发编程有什..

hero_xs的博客 1670

java并发编程——多线程

本章主要介绍java中多线程并发编程基础知识,包括的内容有: 进程,线程,协程的区别 多线程的实现方式 线程中断和优先级 线程状态的切换 一、进程、线程和协程 1.1 进程、线程和协程 进程是资源分配的最小单位,操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源)。进程拥有自己独立的堆和栈,既不共享堆,也不共享栈。 线程是CPU调度的最小单位,线程有自己的堆栈和局部变量,...

西木风落 1020

并发编程:多线程

本文主要介绍并发编程中多线程的知识

AWSDN的博客 893

Java多线程和并发编程

Java多线程和并发编程 多进程 程序不再是顺序执行了,上下两个while循环在交替运行 多线程只能打开一个程序,但是程序运行中是可以好几个函数交替执行 多进程是可以打开好几个程序 Start方法会自动以新进程调用run方法,底层使用JNI来实现的 Start会自动触发run方法,这是Thread自己的一个机制,也就相当于认识start和run这两个...

hxxjxw的博客 808

Java 多线程并发编程

与进程相比,线程更“轻量”,共享所属进程的资源(如内存空间、文件描述符等),减少了创建与切换成本。在经典生产者 - 消费者场景,生产者生产物品放入共享缓冲区,消费者从缓冲区取物品消费,需协调二者速度避免缓冲区溢出或空等情况。对象锁定代码块,功能类似,却能更灵活把控同步范围,降低锁粒度,减少不必要阻塞,提升并发效率。频繁创建、销毁线程开销大,线程池可统一管理线程,复用已有线程执行任务,提升系统性能与稳定性。创建固定 3 个线程的线程池,循环提交 10 个任务,线程池自动调度线程执行,任务结束可调用。

leo__520的博客 717

多线程并发编程

多线程并发编程单线程串行程序多线程并发程序 并发:采用分时技术同时执行多个程序的方式 进程: 一个运行环境,具有所需的计算资源和存储资源,每个进程运行一个程序,多个进程通过分时技术分享cpu的计算资源,通过地址空间映射技术分享内存的存储资源,操作系统全权负责进程的创建,管理,调度和删除 线程: 指令序列(算法)单独创建的线程,每个线程负责执行一个算法,进程中创建多个线程 进程和线程关系: 进程包含...

MP-214的博客 868

关于 java:7. 多线程与并发编程

System.out.println("守护线程");});// 设置为守护线程(主线程退出,它也退出)// 设置线程名称,方便调试和逆向时识别t.start();是一个函数式接口,可用 lambda 表达式实现;call()方法执行任务逻辑并返回一个结果;可以抛出受检异常(Exception。

Triste__chengxi的博客 1583
上一篇: 并发编程——Process模块、Queue队列
下一篇: MySQL——查询关键字、多表查询
Jakey_src
博客等级 码龄9年 10粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值