Python多线程

python 多线程 python 多线程是指在同一个程序中同时运行多个线程,每个线程都可以独立执行不同的任务。python 中的多线程实现可以通过 threading 模块来实现。 阅读详情

1.同时执行多个任务

  •     多进程模式
  •     多线程模式
  •     多进程+多线程

   注:进程是操作系统分配资源的最小单元。线程是操作系统调度的最小单元。

2.多线程编程

  • 多任务可以由多进程完成,也可以由一个进程中的多线程完成(一个进程至少有一个进程)

3.Python中模块

  • _thread和threading。_thread是低级模块,threading是高级模块,对_thread进行了封装。绝大多数情况下我们使用的是threading高级模块

3.启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行

import threading
import time


def loop(x):
    print("%s start" % threading.current_thread().name)
    for i in range(x):
        time.sleep(1)
        print("%s : %d" % (threading.current_thread().name, i))
        # print("%s stop" % threading.current_thread().name)
    print("%s stop" % threading.current_thread().name)


print("%s start" % threading.current_thread().name)
t1 = threading.Thread(target=loop, args=(6,))
t1.start()
print("%s stop" % threading.current_thread().name)

结果:

MainThread start

Thread-1 start
MainThread stop
Thread-1 : 0
Thread-1 : 1
Thread-1 : 2
Thread-1 : 3
Thread-1 : 4
Thread-1 : 5

Thread-1 stop

结果分析:主线程先运行完毕,再运行子线程

4.如果希望主线程等待子线程执行完毕,使用join()方法

import threading
import time


def loop(x):
    print("%s start" % threading.current_thread().name)
    for i in range(x):
        time.sleep(1)
        print("%s : %d" % (threading.current_thread().name, i))
        # print("%s stop" % threading.current_thread().name)
    print("%s stop" % threading.current_thread().name)


print("%s start" % threading.current_thread().name)
t1 = threading.Thread(target=loop, args=(6,))
t1.start()
t1.join()
print("%s stop" % threading.current_thread().name)

结果:

MainThread start
Thread-1 start
Thread-1 : 0
Thread-1 : 1
Thread-1 : 2
Thread-1 : 3
Thread-1 : 4
Thread-1 : 5
Thread-1 stop

MainThread stop

结果分析:MainThread 一直停在join位置,直到子线程运行完毕

6.主线程退出的时候,不管子线程运行到哪里,强制退出子线程,使用setDaemon(True), 这个方法在线程启动之前调用

import threading
import time


def loop(x):
    print("%s start" % threading.current_thread().name)
    for i in range(x):
        time.sleep(1)
        print("%s : %d" % (threading.current_thread().name, i))
        # print("%s stop" % threading.current_thread().name)
    print("%s stop" % threading.current_thread().name)


print("%s start" % threading.current_thread().name)
t1 = threading.Thread(target=loop, args=(6,))
t1.setDaemon(True)
t1.start()
# t1.join()
print("%s stop" % threading.current_thread().name)

结果:

MainThread start
Thread-1 start

MainThread stop

7.线程锁(lock)

多线程和多进程最大的不同在于,多进程同一变量各自有一份拷贝存在每个进程中,互不影响,而多线程所有变量由线程共享,所以任何一个变量都可以由任何一个线程修改,因此线程间共享数据最大的危险在与多个线程同时改变一个变量,把内容给改乱了。解决方法:使用threading.Lock()方法,使用线程锁锁定线程需要使用的对象,确保一次只有一个线程能够使用该对象。

实例:多线程操作同一对象出错

import threading

deposit = 0  # 存款


def change(n):
    global deposit
    deposit = deposit + n
    deposit = deposit - n


def loop(n):
    for i in range(10000000):
        change(n)


t1 = threading.Thread(target=loop, args=(5,))
t2 = threading.Thread(target=loop, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(deposit)

结果:

45

结果分析:t1,t2交替运行,当两个线程同时访问一个对象时候,容易出错


使用线程锁结果该问题:

import threading

deposit = 0  # 存款


def change(n):
    global deposit
    deposit = deposit + n
    deposit = deposit - n


def loop(n):
    for i in range(10000000):
        lock.acquire()  # 取得一个锁
        try:
            change(n)
        finally:
            lock.release()  # 释放一个锁


lock = threading.Lock()  # 创建一个锁对象
t1 = threading.Thread(target=loop, args=(5,))
t2 = threading.Thread(target=loop, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(deposit)

结果:

0

8.线程锁讨论

线程锁确保某段关键代码只能由一个线程从头到尾完整执行,但是线程锁阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率大大降低。其次由于可以存在多个锁,不同线程支持不同的锁,试图获得对方的锁时,可能会造成死锁。

9.全局解释器锁(GIL)

任何python线程执行前都必须获得GIL锁,执行代码直到线程睡眠或者python将它挂起,线程释放GIL。一个处理核心只能在同一时间运行一个线程。Python中可以使用多线程,但不能有效的利用多个处理核心。可以使用多进程来利用多核。

cpu密集型(各种循环,计数等):遇到io操作或者ticks超过100(每执行100条字节码),释放GIL。触发GIL竞争,线程间的来回切换需要消耗资源,故而多线程对CPU密集型代码并不友好。

io密集型(文件处理/网络爬虫):动线程能提升效率(单线程io会进行io等待,造成不必要的时间浪费,开启多线程可以让进程A等待时自动切换到线程B,可以不浪费cpu资源,提升效率)

10.为什么多进程不会有上述情况。

每一个进程都有各自独立的GIL,互不影响。

Python 多线程教程 在软件编程中,线程是具有独立指令集的最小执行单元。它是进程的一部分,并在共享程序的可运行资源(如内存)的相同上下文中运行。一个线程有一个起点、一个执行顺序和一个结果。它有一个指令指针,用于保存线程的当前状态并控制接下来按什么顺序执行。一个进程并行执行多个线程的能力称为多线程。理想情况下,多线程可以显着提高任何程序的性能。而且 Python 多线程机制非常人性化,您可以快速学习。 阅读详情

相关推荐

【Python】多线程

好的,我们将开启一个关于“Python中的多线程”的全新、极致深入的探索。这不仅仅是对模块的简单罗列,我们将深入剖析其内部机制、高级应用、在复杂运维和企业级真实场景中的应用之道,并辅以海量详尽的代码示例和逐行中文解释。我们的目标是构建一部关于Python多线程编程的终极参考,内容覆盖从基础概念到高级技巧,从理论剖析到实战应用。在现代计算中,并发 (Concurrency) 和并行 (Parallelism) 是提升程序性能和响应能力的关键技术。多线程 (Multithreading) 是实现并发的一种重要手

宅男很神经 1189

python的多线程

python多线程 一、线程的概念 线程是CPU分配资源的基本单位。当一程序开始运行,这个程序就变成了一个进程,而一个进程相当于一个或者多个线程。当没有多线程编程时,一个进程相当于一个主线程;当有多线程编程时,一个进程包含多个线程(含主线程)。使用线程可以实现程序大的开发。 多个线程可以在同一个程序中运行,并且每一个线程完成不同的任务。 多线程实现后台服务程序可以同时处理多个任务,并不发生阻塞现象。 多线程的程序设计的特点就是能够提高程序执行效率和处理速度。python程序可以同时并行运行多个相对独立的线

weixin_61805348的博客 7万+

Cesium创建无人机视锥,同步视锥与鹰眼地图视角,实现视锥键盘控制。解决视锥初始化位置不准确问题等

本文描述了一个基于Cesium的3D视锥体可视化系统开发过程。系统实现了主视图与鹰眼视图的双屏联动,支持通过键盘控制视锥体的空间移动(WASD前后左右,Q/E旋转,C/Z升降),并实时同步更新两个视图。关键技术包括:1)基于主视图Scene创建Camera实现视锥体精确绘制;2)通过PerspectiveFrustum设置视锥参数;3)建立双视图的相机位置及视角同步机制。目前暂未实现视锥体far/near边界在鹰眼视图中的可视化,该系统可应用于无人机视角监控等三维场景交互需求。

coder_bin的博客 1589

Python 多线程学习

前言 在爬虫学习的过程中,一旦爬取的数量过大,很容易带来效率问题,为了能够快速爬取我们想要的内容。为此我们可以使用多线程或者多进程来处理。 多线程和多进程是不一样的!一个是 threading 库,一个是 multiprocessing 库。而多线程 threading 在 Python 里面被称作鸡肋的存在!关于 Python 多线程有这样一句名言——“Python下多线程是鸡肋,推荐使用多进程...

Herishwater的博客 3715

H5 获取手机GPS坐标

只要手机有GPS模块,可以用HTML5的Geolocation接口获取 在HTML5中,geolocation作为navigator的一个属性出现,它本身是一个对象,拥有三个方法: getCurrentPosition watchPosition clearWatch 1.简单 function getLocation(){ if(navigator.geolocation){ //判断是否有这个对象 navigator.geoloc

达拉崩巴斑得贝迪卜多比鲁翁_ 4668

【LCMM实战指南】从增长混合模型到潜在类别轨迹分析的纵向数据建模

本文深入解析了LCMM(潜在类别混合模型)在纵向数据建模中的应用,对比了LCGA与GMM的核心差异与选择策略。通过R语言lcmm包的实战演练,详细展示了从数据模拟、模型拟合、类别数选择到结果解读的全流程,为识别数据中不同的发展轨迹亚型提供了系统指南。

weixin_29070861的博客 379

Python 多线程

多线程是指程序中可以独立于其他部分并发执行的一系列指令。可以将它们视为进程中的不同单元,这些单元在被调度时可以独立完成任务。当线程需要等待缓慢的外部操作(如网络请求或磁盘访问)完成时,它们会暂时休眠,从而使调度器可以将时间分配给其他线程执行。进程是计算机程序的一个可执行实例。通常,一个进程是在单个控制流序列中执行的。进程是操作系统分配资源的基本单位,每个进程包含一个或多个线程。进程之间是隔离的,每个进程拥有自己的内存空间和系统资源。在这篇文章中,我们探讨了 Python 多线程的基本概念。

疯一样的码农 1427

FPGA实现AXI-Stream通信

本文介绍了在FPGA中实现AXI-Stream接口的工业级方案,重点解析了核心协议信号(TVALID/TREADY/TDATA/TLAST)与可选扩展信号,并提供了Verilog最小化实现示例。文章详细阐述了握手协议规则、时序约束方法,以及吞吐量优化技巧(如寄存器切片和双缓冲策略),同时给出了跨时钟域处理的异步FIFO解决方案。此外,还包含验证调试方法(Testbench结构和ILA触发设置)和典型应用场景(视频处理/网络传输),最后提供了资源消耗参考数据。该实现方案严格遵循Xilinx/Intel官方规范

whm128的博客 1464

python多线程编程

1、多线程的发展背景 随着计算机的发展,无论是硬件还是软件都在快速的发展。 在最开始的时候,计算机都是只有一个cpu来进行指令控制和运算,程序执行的时候都是一个进程一个进程的运行,也就是顺序执行的方式,所有的进程都是排成一个队列,然后cpu取出其中的一个进程,然后运行。 在硬件发展的时候,慢慢发展为几颗cpu,并且发展出来了几核cpu,从而在一般的服务器上都是四核的,并且至少是两颗,从而在每...

KEL 6222

在ParaView中编程实现涡量可视化

综上所述,本文介绍了在ParaView中使用编程方式实现涡量可视化的方法,并提供了相应的Python代码示例。通过灵活运用ParaView的编程接口,我们可以根据特定需求定制复杂的数据可视化流程,进一步深入了解和分析流体的旋转行为。ParaView是一款强大的开源数据可视化工具,它提供了丰富的功能和灵活的编程接口,使用户能够定制数据可视化流程。你可以根据需要自定义颜色映射范围和颜色,上述代码中的RGBPoints列表中包含了两个点,分别对应涡量值为0和10时的颜色。在实际使用过程中,你需要替换代码中的。

ByteProwl的博客 1434

uniapp - 强力解决H5网页浏览器跨域问题,如何解决uniapp请求接口在浏览器跨域问题,UniApp H5 跨域代理配置详细教程完美解决所有uniapp跨域(调用第三方接口或服务器api跨域)

uni-app 跨域,uniApp解决h5跨域问题,解决uni-app请求接口在浏览器跨域问题,uni.request请求跨域问题解决方案,uni-app-跨域解决方法,彻底解决uniapp发布为H5的跨域问题,uniapp H5页面设置跨域请求_uniapp h5跨域配置,uniapp开发 H5 解决跨域问题,uniApp请求解决跨域问题,uniapp request如何实现前端请求跨域,解决uniapp调试过程中的请求跨域和环境配置,Uniapp调用外部api接口跨域请求,uni-app发布H5页面跨域

🏆 前端领域优质创作者 5354

python多线程库_python多线程库

广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!python 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点:使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 程序的运行速度可能加快在一些等待的任务实现...

weixin_39622710的博客 1742

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

丨汀、的博客 4327

python多线程

python多线程及notify和wait的是使用python多线程多线程创建方式多线程管理 python多线程 python主要是通过thread和threading这两个模块来实现多线程支持。python的thread模块是比较底层的模块,python的threading模块是对thread做了一些封装,可以更加方便的被使用。但是python由于GIL(global interpreter l...

snow_xiaoru的博客 2960

芒果YOLO11改进44:主干Backbone篇之MobileViT::结合最新 ICLR2022 顶会|轻量通用的MobileViT结构(一)Transformer,轻量级、通用且移动友好的视觉转换

MobileViT::结合最新 ICLR2022 顶会|轻量通用的MobileViT结构(一)Transformer,轻量级、通用且移动友好的视觉转换

包括YOLOv5、YOLOv7、YOLOv8等模型改进 369

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

python多线程教程:python多线程详解

文章目录一、线程介绍二、线程实现threading模块自定义线程守护线程主线程等待子线程结束多线程共享全局变量递归锁事件(Event类)三、GIL(Global Interpreter Lock)全局解释器锁 python多线程详解 一、线程介绍 什么是线程 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源...

python多线程基础教程进阶教程 3003

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

python多线程_Python多线程的一些知识

Python多线程的一些知识前言了更好地体验多线程爬虫,本章先介绍下需要了解的知识点,以便后续的多线程爬虫文章有更好的理解与学习。在接下来要讲的知识点中,感兴趣的读者们请先弄清楚进程和线程两者是什么?它们各自有着什么样的关系呢?读下廖雪峰老师简单介绍的例子,比喻非常生动清晰,故这里不多做讲解。进程和线程​www.liaoxuefeng.com看完后记住其中一个观念:进程是由若干线程组成的,一个进程...

weixin_39758229的博客 184

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

假人有限元模型

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

python什么是多线程_python中多线程指的是什么

python中多线程指的是什么发布时间:2020-09-03 10:59:59来源:亿速云阅读:73作者:小新这篇文章主要介绍python中多线程指的是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、多线程的理解多进程和多线程都可以执行多个任务,线程是进程的一部分。线程的特点是线程之间可以共享内存和变量,资源消耗少(不过在Unix环境中,多进程和多线程资源调度消耗差距...

weixin_39887531的博客 583

Python10 python多线程

Python的多线程指的是在一个Python程序中同时运行多个线程,以达到并发执行多个任务的目的。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。在Python中,多线程的实现通常依赖于内置的threading模块,这个模块允许用户创建和管理线程。使用多线程可以使得程序能够在等待某些事件(如输入/输出操作)完成时,继续执行其他任务,从而提高程序的整体效率和响应速度。

Argulo的博客 1136

让 Python 真正支持多线程

Python 至今都缺乏对多线程的原生支持。本文深入探讨 Python 无法引入多线程的背后机制,以及如何使用子解释器 API 编写真正并发的 Python 代码。

略懂……略懂…… 4467

Python教程:一文掌握Python多线程(很详细)_python 多线程教程

在多线程编程中,为了避免多个线程同时访问共享资源导致数据混乱或不一致的问题,可以使用 对象实现线程同步。下面是一个简单的示例: 在上面的示例中,通过 对象确保了 变量的原子性操作,避免了多线程同时修改导致的问题。另一种常见的方式是使用 实现线程间的通信。 是线程安全的数据结构,可以在多个线程之间安全地传递数据。以下是一个简单的示例: 在上面的示例中,通过 实现了生产者和消费者模式,生产者向队列中放入数据,消费者从队列中取出数据进行消费,实现了线程间的通信。使用 ThreadPoolExecutor

2401_83703866的博客 1948

多线程以及python的多线程

1.1 线程和进程 进程:系统分配资源最小单位,进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。 线程:系统调度最小单位,线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程

758

python多线程数据交互_python 多线程 通信

一篇文章搞定Python多进程(全)公众号:pythonislover前面写了三篇关于python多线程的文章,大概概况了多线程使用中的方法,文章链接如下:一篇文章搞懂Python多线程简单实现和GIL - https://mp.weixin.qq.com/s/Hgp-x-T3ss4IiVk2_4VUrA一篇文章理清Python...文章南山yrg2019-05-052651浏览量干货大礼包!21...

weixin_39726971的博客 1540
上一篇: Python单例模式
下一篇: Python 3 爬虫 豆瓣电影top250(requests,BeautifulSoup解析)
learnpy3
博客等级 码龄9年 8粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值