首页 > 编程语言 >Python—面向对象小解(5)

Python—面向对象小解(5)

时间:2024-06-02 15:57:35浏览次数:17  
标签:__ start Python 小解 面向对象 线程 print 进程 def

一、多任务介绍

1.1 进程与线程

进程是操作系统分配资源的最小单元

线程执行程序的的最小单元

线程依赖进程,可以获取进程的资源

一个程序执行 先要创建进程分配资源,然后使用线程执行任务

默认情况下一个进程中有一个线程

1.2 多任务介绍

运行多个进程或线程执行代码逻辑

多个进程或线程同时执行叫做并行执行

多个进程或线程交替执行叫做并发执行

必行还是并发有cpu个数决定

5个进程 cpu核心是3个 计算时时并发执行 5个进程需要抢占cpu资源,谁抢到谁执行代码计算

5个进程 cpu核心10个 计算时时并行执行 不需要抢占资源,没个进程都已一个独立的cpu核心使用完成计算

多任务在执行计算时,可以执行的同一的计算任务,也可以执行不同的任务

def func(data):
    a  = 1
    for i in data:
        a+=i
       
    return a

def func2(data):
    a  = 1
    for i in data:
        a-=i
       
    return a

def func3(data):
    a  = 1
    for i in data:
        a*=i
       
    return a

def func4(data):
    a  = 1
    for i in data:
        a%=i
       
    return a

def func4(data):
    a  = 1
    for i in data:
        a**=i
       
    return a
 
可以有5个线程或进程执行一个函数任务 func  ,那么还函数会被执行5次

也可以5个线程或进程执行不同的函数任务,每个函数任务被执行1次

1.3 多进程

多进程实现多任务就是创建多个进程执行任务函数

任务1 唱歌 任务2 跳舞 任务3 弹吉他

不使用多任务执行

程序执行顺序是从上往下依次执行,如果上一个函数没有执行完成,那么下一个函数,不会被执行

import time
def sing():
    print('唱歌')
    time.sleep(4) # 停止4秒 模拟程序执行4秒
    print('唱歌2')


def dance():
    print('跳舞')


def tanzou():
    print('弹吉他')


sing()
dance()
tanzou()

使用多进程实现多任务

# 多进程实现多任务
import time
# 使用模块方法创建多个进程
from multiprocessing import Process

def sing():
    print('唱歌')
    time.sleep(4) # 停止4秒 模拟程序执行4秒
    print('唱歌2')


def dance():
    print('跳舞')


def tanzou():
    print('弹吉他')


if __name__ == '__main__':
    # 创建进程
    # 创建不同的进程执行不同的任务
    p1 = Process(target=sing)
    p2 = Process(target=dance)
    p3 = Process(target=tanzou)

    # 执行进程
    p1.start()
    p2.start()
    p3.start()
I-任务中的参数传递
# 多进程实现多任务
import time
# 使用模块方法创建多个进程
from multiprocessing import Process

def sing(username,singname):
    print(f'唱{username}的{singname}歌')

def dance(name):
    print(f'跳{name}舞')


def tanzou():
    print('弹吉他')


if __name__ == '__main__':
    # 创建进程
    # 创建不同的进程执行不同的任务
    # 传递参数的两种方式
    p1 = Process(target=sing,kwargs={'username':'周杰伦','singname':'稻香'})
    p2 = Process(target=dance,args=['霹雳'])
    p3 = Process(target=tanzou)

    # 执行进程
    p1.start()
    p2.start()
    p3.start()
II-获取进程编号
  • getpid

  • getppid

# 多进程实现多任务
import time
# 使用模块方法创建多个进程
from multiprocessing import Process
import os

def sing(username,singname):
    print(f'子进程1的编号{os.getpid()}')
    print(f'子进程1的父进程编号{os.getppid()}')
    print(f'唱{username}的{singname}歌')

def dance(name):
    print(f'子进程2的编号{os.getpid()}')
    print(f'子进程2的父进程编号{os.getppid()}')
    print(f'跳{name}舞')


def tanzou():
    print(f'子进程3的编号{os.getpid()}')
    print(f'子进程3的父进程编号{os.getppid()}')
    print('弹吉他')


if __name__ == '__main__':
    # 创建进程
    # 创建不同的进程执行不同的任务
    # 传递参数的两种方式
    p1 = Process(target=sing,kwargs={'username':'周杰伦','singname':'稻香'})
    p2 = Process(target=dance,args=['霹雳'])
    p3 = Process(target=tanzou)

    # 执行进程
    p1.start()
    p2.start()
    p3.start()
    print('主进程')
    # 获取当前进程的pid编号
    print(os.getpid())

主进程默认情况下是等待子进程结束后在结束整个进程的

也可以通过exit()方法强制退出主进程,所有进程都结

III-保证进程的执行顺序

会影响执行效率

如果进程之间没有对应的数据传递关系,可以不用保证顺序,多个进程可以同时执行

如果进程之间有数据传递需求,就要保证执行顺序,通过join操作,但是该操作会影响执行效

IV-进程间的数据不共享

每个进程的资源时独立。数据就不共享

1.4 多线程

线程依赖进程,可以创建一个进程,在一个进程下创建多个线程执行任务

# 多线程实现多任务
from threading import Thread

import time
import os

def sing():
    print(f'线程1的进程编号{os.getpid()}')
    print('唱歌')
    time.sleep(4) # 停止4秒 模拟程序执行4秒
    print('唱歌2')


def dance():
    print(f'线程2的进程编号{os.getpid()}')
    print('跳舞')


def tanzou():
    print(f'线程3的进程编号{os.getpid()}')
    print('弹吉他')

if __name__ == '__main__':
    # 创建线程
    t1 = Thread(target=sing)
    t2 = Thread(target=dance)
    t3 = Thread(target=tanzou)

    # 执行线程任务
    t1.start()
    t2.start()
    t3.start()
    print(f'主进程编号{os.getpid()}')
线程任务传参
from threading import Thread
def sing(username,singname):

    print(f'唱{username}的{singname}歌')

def dance(name):

    print(f'跳{name}舞')


def tanzou():
    print('弹吉他')

if __name__ == '__main__':
    # 创建线程传递参数
    t1 = Thread(target=sing,kwargs={'username':'凤凰传奇','singname':'月亮之上'})
    t2 = Thread(target=dance,args=['圆桌舞'])
    t3 = Thread(target=tanzou)

    t1.start()
    t2.start()
    t3.start()
线程执行任务顺序保证

线程的执行顺序也是无序的,如果需要保证线程执行顺讯也是通过join保证

from threading import Thread
import os
def sing(username,singname):
    print(f'线程1的编号{os.getpid()}')
    print(f'唱{username}的{singname}歌')

def dance(name):
    print(f'线程2的编号{os.getpid()}')
    print(f'跳{name}舞')


def tanzou():
    print(f'线程3的编号{os.getpid()}')
    print('弹吉他')

if __name__ == '__main__':
    # 创建线程传递参数
    t1 = Thread(target=sing,kwargs={'username':'凤凰传奇','singname':'月亮之上'})
    t2 = Thread(target=dance,args=['圆桌舞'])
    t3 = Thread(target=tanzou)

    t1.start()
    t1.join()
    t2.start()
    t2.join()
    t3.start()
    t3.join()
线程键共享数据

多个线程是在一个进程下运行,他们可以使用同一个进程下的资源

# 线程共享数据
from threading import Thread
a = 0


def func_add1():
    global a
    for i in range(1000):
        a += 1

    print(f'线程1的结果{a}')


def func_add2():
    global a
    for i in range(2000):
        a += 1
    print(f'线程2的结果{a}')

if __name__ == '__main__':

    t1= Thread(target=func_add1)
    t2= Thread(target=func_add2)

    t1.start()

    t2.start()

    # 主进程
    print(a)

当共享数据是,多个线程操作同一个数据,那么有可能会因为资源抢占造成计算错误

可以通过join保证数据能完整计

# 线程共享数据
from threading import Thread
a = 0


def func_add1():
    global a
    for i in range(1000000):
        a += 1

    print(f'线程1的结果{a}')


def func_add2():
    global a
    for i in range(1000000):
        a += 1
    print(f'线程2的结果{a}')

if __name__ == '__main__':

    t1= Thread(target=func_add1)

    t2= Thread(target=func_add2)

    t1.start()
    # 可以通过join保证执行顺序等上一个线程执行完成后再执行其他的
    t1.join()

    t2.start()
    t2.join()

    # 主进程
    print(f'主进程的结果{a}')

1.5多任务总结

进程和线程

进程是分配资源的最小单元 线程是执行任务的最小单元

实现多任务可以使用多进程或多线

为什么要使用多任务?

提升计算效率,当cpu资源充足是,可以实现多个任务同时执行。

后续spark底层实现采用的多线程方式,spark计算效率很高。spark已经封装实现,开发不需要写多线程。

实际开发为什么不用多进程实现多任务?更多是采用多线程?

创建进程的开销加大,创建时间长。每创建一个进程都需要额外有计算机分配资源,分配资源也会耗费时间

多进程间不共享数据

多线程会共享数据,如果发生资源抢占会造成数据计算错误

标签:__,start,Python,小解,面向对象,线程,print,进程,def
From: https://blog.csdn.net/weixin_49811843/article/details/139365493

相关文章

  • 03、面向对象
    1、面向对象三条主线Java类及类的成员 字段、方法、构造器、代码块。内部类面向对象的三大特征 封装、继承、多态其它关键字 this、package、import、super、static、final、interface2、面向过程与面向对象面向过程(POP) 面向过程,强调的是功能行为,以函数为最小单位,考......
  • 【程序异常记录】01 --- python编码问题
    问题描述df=pd.read_csv(meter_path,encoding='utf-8')指定utf-8编码读取后赋值到rosmsg进行topicpublish报错error:fieldmeters_result[].task_meter_id.meter_id.alias_nameisanon-asciistringtips:str通过encode()方法可以编码为指定的bytes。反过来,当从网络或......
  • 椭圆曲线密码学(ECC)加解密,附带python代码
    想起来很久没写博客了,刚好今天要写实验报告,随便把之前的也完成吧1.椭圆曲线概念椭圆曲线在经过化解后,可以用这条式子表达:E:y²=x³+ax+b其背后的密码学原理,是基于椭圆曲线离散对数问题,比RSA算法更有安全且运算速度更快。在看上面的式子,我们知道构造一个椭圆曲线,需要a,b两个参数......
  • Python中的魔法函数
        大家好,Python作为一种高级编程语言,以其简洁、优雅和易读性而闻名。然而,Python的强大之处不仅仅在于其语法的简洁性,还在于其灵活的面向对象编程范式。在Python中,有一类特殊的方法被称为“魔法函数”,它们以双下划线(__)开头和结尾,为Python提供了一种强大的机制,使得用......
  • 使用python绘制小提琴图
    使用python绘制小提琴图小提琴图效果代码小提琴图小提琴图(ViolinPlot)是一种结合了箱线图和核密度估计图的图形,用于显示数据分布的情况。它不仅展示了数据的四分位数、最大值和最小值,还通过密度曲线展示了数据的分布形状。相比于传统的箱线图,小提琴图可以提供更多关......
  • 【python学习】Anaconda的介绍、下载及conda和pip换源方式(切换到国内镜像源)
    什么是AnacondaAnaconda是一个专为数据科学和机器学习预装了多种库的Python发行版。提供了包管理与环境管理的功能解决了多个版本python并存的问题解决了第三方包安装问题如何下载Anaconda官网地址:https://www.anaconda.com/点击右上角的FreeDownload填写邮箱地址......
  • 九天毕昇深度学习平台 | 升级python版本3.8
    下载3.8版本https://www.python.org/ftp/python/3.8.18/Python-3.8.18.tgz解压!tar-xvfPython-3.8.18.tgz在终端配置./configure#(可选--prefix=/usr/local/python3.8.18)makesudomakeinstall不指定--prefix时,configure会将可执行文件安装到/usr/local/bin,库......
  • 202305青少年软件编程(Python)等级考试试卷(四级)
    第1题【单选题】有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。问第n年的时候,共有多少头母牛?由递推法可推测,当年数小于等于4的时候,第几年就是有几头牛,即a[1]=1;a[2]=2;a[3]=3;a[4]=4。当n大于4的时候,这时候第......
  • 什么!你还在学列表和元组?!这一篇文章就够了!之Python基础篇-列表与元组
    列表定义列表的格式:列表名=[元素1,元素2,元素3,......]空列表的定义:my_list=[](常用)  或  my_list=list()列表中的元素不需要具有相同的类型。#定义列表list1,且列表中的元素不具有相同的类型>>>list1=['xiaoming','m',201,54,'13458714']>>>type(list......
  • Anaconda安装Python的seaborn库
      本文介绍在Anaconda的环境中,安装Python语言中,常用的一个绘图库seaborn模块的方法。  seaborn模块是基于Matplotlib的数据可视化库,它提供了一种更简单、更漂亮的界面来创建各种统计图形。seaborn模块主要用于数据探索、数据分析和数据可视化,使得我们在Python中创建各种统计......