Python 多进程多线程

news2025/1/16 5:37:52

多任务

并发:在一段时间内交替执行多个任务

并行:在一段时间内同事一起执行多个任务

进程 Process

进程:一个程序运行在系统之上, 便称这个程序喂一个运行进程,并分配进程ID方便系统管理。操作系统进行资源分配和调度运行的基本单位

单进程 vs 多进程

+/ 如果程序向利用计算机的多核优势,让CPU同时处理一些任务,适合用多进程开发

 先挖个坑后面学

线程 thread

线程是属于进程的,一个进程可以开启多个线程,执行不同工作,是进程实际工作最小单位

同属一个进程的多个线程共享进程所拥有的全部资源

性质

执行顺序

无序,通过CPU调度决定某个线程先执行

结束顺序

主线程会等待所有子线程执行结束后再结束

基本使用

创建线程对象

thread_obj = thread.Thread(target=func) 

启动线程执行

thread_obj.start()

import threading
import time

def thread1():
    while True:
        print('thread 1')
        time.sleep(1)

def thread2():
    while True:
        print('thread 2')
        time.sleep(1)

if __name__ == '__main__':
    # create thread
    t1 = threading.Thread(target=thread1)
    t2 = threading.Thread(target=thread2)
    # start thread
    t1.start()
    t2.start()

等待当前线程任务执行完毕后再向下继续执行

thread_obj.join()

执行带有参数的任务

args:以元组方式进行传参 *参数顺序保持一致

kwargs:以字典的方式给任务传参  *字典key和参数名保持一致

守护线程

主线程不等待子线程执行完成,主线程执行完毕后,子线程也自动关闭

me,thod1

threading.Thread(target = work, daemon = True)

method2

线程对象.setDaemon(True)

获取线程信息

current_thread = threading.current_thread()

print(current_thread)

设置/获取名称

name = 线程对象.current_thread().getName()

线程对象.setName()

自定义线程

class Mythread(threading.Thread):

        def run(self):

                print('执行此线程', self.args)


t = Mythread(args = (100, ))
t.start()

线程安全

多个线程操作可能会出现数据混乱的情况

*有些数据类型(如列表)是线程安全的

GIL锁

全局解释器锁(Global Interpreter Lock),让一个进程中同一个时刻只能有一个线程可以被CPU调用


 

Lock 同步锁

创建锁

lock_object = threading.RLock()

加锁

线程对象.acquire()

释放锁

线程对象.release() 

e.g

import  threading

lock_object = threading.Lock()

loop = 1000
number = 0

def _add(count):
    lock_object.acquire() #加锁
    global number
    for i in range(count):
        number += 1
        print("t1")
    lock_object.release() #解锁

def _sub(count):
    lock_object.acquire() #申请锁
    global number
    for i in range(count):
        number -= 1
        print("t2")
    lock_object.release() #解锁

t1 = threading.Thread(target=_add,args=(loop,))
t2 = threading.Thread(target=_sub,args=(loop,))
t1.start()
t2.start()

t1.join()
t2.join()

print(number)

RLock 递归锁

Lock不支持锁的嵌套,RLock支持,就是可以加多次锁

Dead Lock 死锁

由于资源竞争或者彼此通信造成阻塞

线程池

线程不是开的越多越好,开的多了可能导致系统性能降低(线程中的上下文切换),因此不建议无限制的创建线程,建议使用线程池

创建

from concurrent.futures import ThreadPoolExecutor
pool = ThreadPoolExecutor(100)   #100个线程的线程池

提交任务

pool.submit(task, sug)

等待线程池执行完毕

pool.shutdown(True)

空闲线程处理额外任务

线程池中提交一个任务,如果有空闲线程,则分配一个线程去执行,执行完毕后再将线程交还给线程池,如果没有空闲线程,则等待

future  =pool.submit(task,url)

future.add_done_callback(done) 

单例模式

import threading
import time

class Singleton:
    instance = None
    lock = threading.RLock()

    def __init__(self,name):
        self.name = name

    def __new__(cls, *args, **kwargs):  #*args,**kwargs 代表任意多个参数
        # 这两行提高效率,可要可不要
        if cls.instance:
            return cls.instance

        with cls.lock:
            if cls.instance:
                return cls.instance
            cls.instance = object.__new__(cls)
            return cls.instance

def task():
    obj = Singleton('x')
    print(obj)

for i in range(10):
    t = threading.Thread(target=task)
    t.start()

线程和进程对比

关系

线程依附在进程里面,没有进程就没有线程

一个进程有一个及以上线程

区别

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

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

线程不能独立执行,必须依存在进程中

优缺点

进程:可多核,开销大

线程:不可多核,开销小

应用:

计算密集型,多进程。 e.g大量的数据计算

IO密集型,多线程 e.g 文件读写,网络数据传输

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

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

相关文章

Android开发之apk瘦身计划

为什么apk越来越大? 1.项目不断发展,功能越多,代码量增加的同时,资源文件也在不断的增多。 2.app支持的主流dpi越来越多,如ldpi、mdpi、hdpi、xh xxh xxxh等等,间接导致资源增多。 3.引入的第三方sdk或开…

Linux进程空间地址

程序地址空间回顾 问题引入 ---------------明天再写0.0

Linux提取RPM包文件

在讲解如何从 RPM 包中提取文件之前,先来系统学习一下 cpio 命令。cpio 命令用于从归档包中存入和读取文件,换句话说,cpio 命令可以从归档包中提取文件(或目录),也可以将文件(或目录&#xff09…

【Go入门】面向对象

【Go入门】面向对象 前面两章我们介绍了函数和struct,那你是否想过函数当作struct的字段一样来处理呢?今天我们就讲解一下函数的另一种形态,带有接收者的函数,我们称为method method 现在假设有这么一个场景,你定义…

Qt贝塞尔曲线

目录 引言核心代码基本表达绘制曲线使用QEasingCurve 完整代码 引言 贝塞尔曲线客户端开发中常见的过渡效果,如界面的淡入淡出、数值变化、颜色变化等等。为了能够更深的了解地理解贝塞尔曲线,本文通过Demo将贝塞尔曲线绘制出来,如下所示&am…

SPC 的一些小知识

在生产管理系统种,经常回涉及到质量管理分,我们经常听说SPC、SPC控制图等和SPC相关的词汇,那么SPC是什么意思呢?它有什么作用呢?在这里通俗一点介绍一下SPC。 SPC是统计过程控制(Statistical Process Cont…

xsschallenge通关攻略详解

xsschallenge通过攻略 文章目录 xsschallenge通过攻略第一关第二关第三关第四关第五关第六关第七关第八关第九关第十关第十一关第十二关第十三关 简述 xsschallenge挑战攻略 ps: 终极测试代码 <sCr<ScRiPt>IPT>OonN"\/(hrHRefEF)</sCr</ScRiPt>IPT&g…

系列八、Mybatis一对多查询,只查询出了一条记录

一、Mybatis一对多查询&#xff0c;只查询出了一条记录 1.1、问题说明 典型的权限管理框架的数据库表中&#xff0c;一般会存在这样3种角色的表&#xff0c;即用户表、角色表、用户角色关联表&#xff0c;表设计好之后&#xff0c;往这三张表中初始化了一些测试数据&#xff0…

LOW-POWER AUDIO KEYWORD SPOTTING USING TSETLIN MACHINES

基于TM的低功耗语音关键字识别 摘要1介绍2TM的介绍3KWS的音频预处理技术4实验结果MFC4.1C设置分位数数量4.3增加关键词数量4.4 声音相似的关键词4.5 每个类别的子句数量对KWS-TM的比较学习收敛和复杂性分析 摘要 在本文中&#xff0c;我们探讨了一种基于TM的关键词识别&#x…

【MySQL系列】第二章 · SQL(上)

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

【云备份项目两万字总结】服务端篇 -----附源码

项目总结 整体回顾逐步实现utill.hppconfig.hppdata.hpphot.hppservice.hpp 代码 整体回顾 服务端的目标是&#xff1a; 对客户端的请求进行处理管理客户端上传的文件 于客户端进行数据交换&#xff0c;我们需要引入网络&#xff0c;所以我们引入第三方库----httplib.h库&am…

【Git】Git分支与应用分支Git标签与应用标签

一&#xff0c;Git分支 1.1 理解Git分支 在 Git 中&#xff0c;分支是指一个独立的代码线&#xff0c;并且可以在这个分支上添加、修改和删除文件&#xff0c;同时作为另一个独立的代码线存在。一个仓库可以有多个分支&#xff0c;不同的分支可以独立开发不同的功能&#xff0…

劲松HPV防治诊疗中心发布:HPV感染全面防治解决方案

在当今社会&#xff0c;HPV(人乳头瘤病毒)感染问题已成为广大公众关注的焦点。作为一种高度传染性的病毒&#xff0c;HPV感染不仅可能导致生殖器疣&#xff0c;还可能引发各种癌症。面对这一严重威胁&#xff0c;劲松HPV防治诊疗中心以其专业的医疗团队、正规的治疗流程和全方位…

操作系统(二)内存管理的基础知识

文章目录 前言内存管理地址空间与地址生成连续内存分配内存碎片连续分配算法碎片整理 非连续内存分配虚拟内存管理虚拟内存地址内存分段内存分页段页式内存管理虚拟内存的覆盖技术虚拟内存的交换技术 缺页异常内存页面置换算法局部页面置换算法Belady现象全局页面置换算法抖动和…

【蓝桥杯选拔赛真题66】Scratch画图机器人 少儿编程scratch图形化编程 蓝桥杯创意编程选拔赛真题解析

目录 scratch画图机器人 一、题目要求 编程实现 二、案例分析 1、角色分析

云原生 黑马Kubernetes教程(K8S教程)笔记——第一章 kubernetes介绍——Master集群控制节点、Node工作负载节点、Pod控制单元

参考文章&#xff1a;kubernetes介绍 文章目录 第一章 kubernetes介绍1.1 应用部署方式演变传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上虚拟化部署&#xff1a;可以在一台物理机上运行多个虚拟机&#xff0c;每个虚拟机都是独立的一个环境&…

VUE Slot

在某些场景中&#xff0c;我们可能想要为子组件传递一些模板片段&#xff0c;让子组件在它们的组件中渲染这些片段. <template><h3>ComponentA</h3><ComponentB><h3>插槽传递视图内容</h3></ComponentB> </template> <scr…

Redis04-分布式锁

目录 Redis实现分布式锁 分布式锁的工作流程 Redis实现分布式锁 Redission的watch dog Redis分布式锁的合理应用 Redis实现分布式锁 在单节点的服务器中&#xff0c;java中的synchronized机制是处于JVM层面的&#xff0c;只能保证线程之间的同步。而实际的服务部署中&…

Spring面试题:(六)Spring注解开发原理

ioc过程 发现只要将bean注册到BeanDefinitionMap中就可以创建bean对象 如何将xml配置的bean注册到BeanDefinitionMap 通过注解注册的bean过程一样 注册bean的接口&#xff1a;BeanDefinitionRegistryPostProcessor 开启组件扫描的两种方式&#xff1a;xml和注解 xml方式…