百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python进程和线程保姆式教学,1个台机子多只手干活的秘籍

off999 2024-10-27 11:55 35 浏览 0 评论

进程线程有多重要?刚开始学Python的时候你可能还没有感觉到,因为你写的代码从上到下执行一遍就可以了,但实际上这很初级,实际开发写项目的时候,为了充分利用电脑配置来加快程序进度,我们往往会用到多进程多线程。

就比如说我们的爬虫,没有多进程多线程的程序就像只能一只手干活,而开启了多进程多线程之后就是几只几十只手在干活,你需要10分钟才能爬完的数据,别人可能1分钟不到就弄完了。

私信小编01即可获取大量Python学习资源

进程线程也是Python入门的最后一个板块的知识,基本上我的Python新手入门教程系列文章就要更新完了。

在开始Python的进程和线程教学之前,有一些关于基础概念需要给大家进行讲解。

一、多任务操作系统

操作系统可以执行多个任务,比如我们的Windows系统,除了目前在执行的、你能看得到的几个任务,还有很多后台正在执行的任务,可以用Ctrl+Alt+Del键调出任务管理器看一下就知道了。

我的电脑配置经常会看到有几核处理器的属性,例如我的电脑是12核的,也就是说电脑最多能同时执行12个任务,最多运行12个进程同时进行。

但为什么我们的电脑却能够同时运行几百个任务呢?

其实这得益于操作系统的任务调度,大部分的操作系统是采用抢占时间片的形式进行调度。系统在极其微小的时间内,在多个任务之间进行极快速的切换,比如说8核的操作系统理论上1秒钟之内只能同时执行8个任务,但是系统在1秒钟之内可能在上百个任务之间进行切换,A任务执行一下、B任务执行一下、C任务执行一下…结果1秒钟之内很多任务都能被执行到,造成了肉眼可见的几百个任务在一直执行。

术语叫“宏观并行,微观串行”,实际上电脑在极端的时间内只能执行不超过配置核数的任务数,8核还是只能执行8个任务。

1.何为进程?

既然讲到了任务,那么进程就是任务,1个进程就相当于1个任务,是操作系统分配资源的最小单位。在python中,想要实现多任务可以使用进程来完成,进程是实现多任务的一种方式。

2.何为线程?

进程的多个子任务就称之为线程,线程是进程的最小执行单位, 一个进程可以有很多线程,每个线程执行的任务都不一样。

Python既支持多进程又支持多线程,接下来我们就开始进入Python的进程与线程的学习。

二、Python的多进程multiprocessing(包)

如果你利用多进程,你的Python代码是从头到尾逐行执行的,这其实就是在执行1个进程,这一点应该很好理解。

要想更多利用CPU资源,我们可以利用多进程,这里介绍一个Python多进程时常用的包multiprocessing,它拥有很多的功能,比如子进程、通讯、共享、执行不同的形式等等,我们来了解一些常用的。

1.Process——进程类

Process是multiprocessing里面的一个进程类,通过它就能实现多进程。我们先来看一下它的用法,后面我们会有实际的例子去讲述。

Process(target,name,args,kwargs)
  • target是目标,在哪里新开进程让系统去执行?得给系统一个目标。
  • name是进程的名字,你可以设置也可以不设置,默认是Process-N,N是从1,2,3…N,系统默认从小到大取名。
  • args和kwargs是参数,可用于传递到目标。

Process里面有很多方法,其中最常用的就是start()启动进程的方法。

进程名.start()	#开始进程

举例:写好的代码如下,我想看看开启和没开启多进程调用函数的效果。

import time

#2个要同时执行的函数
def music() :
    for i in range(5):  #执行5次
        print("听音乐中...")
        time.sleep(0.2) #延迟0.2s,目的是让效果对比更明显一些

def movie():
    for i in range(5):
        print("看视频中...")
        time.sleep(0.2) #延迟0.2s
music()
movie()
print("主进程执行完毕")

在没有开启多进程时,执行效果如下:

可以看到,这是很正常的运行情况,程序从上运行到下,逐行运行,music()里面的三次循环没有执行完毕就不会执行movie()里面,以及这两个函数如果没有执行完毕,就不会执行最后一行的print(“主进程执行完毕”)。

我们再来看在上面案例的代码中加入多进程:

import time
import multiprocessing


# 2个要同时执行的函数
def music():
    for i in range(5):  # 执行5次
        print("听音乐中...")
        time.sleep(0.2)  # 延迟0.2s,目的是让效果对比更明显一些


def movie():
    for i in range(5):
        print("看视频中...")
        time.sleep(0.2)  # 延迟0.2s


if __name__ == "__main__":  # 解决Windows系统下调用包时的递归问题
    # 创建子进程
    music_process = multiprocessing.Process(target=music)
    movie_process = multiprocessing.Process(target=movie)

    # 启用进程
    music_process.start()
    movie_process.start()

    print("主进程执行完毕")

代码中我加入了一个if语句来判断__name__这个,为什么?因为在Windows系统下, multiprocessing这个包会发生递归现象,就是会在“导入模块—调用模块”之间反复执行,不信你可以把if语句去掉,把里面的代码全部放到外面来执行就会报错,这是Windows系统下会发生的一个现象,mac、linux等系统是不用加ifl来做判断的。

关于__name__ = "main"这个知识点我在模块与包的初始化时候有讲过,不懂的可以回去看一下。

运行效果

可以看出来,这开启进程之后,代码运行时是有3个进程同时进行的,一个是从上往下执行的主进程,执行到下面输出“主进程执行完毕”,另外两个子进程去执行music()和movie()进程,从他们的执行速度来看,它们是同时在进行的,所以没有像刚才那样非要等其中一个函数里面的代码执行3遍才开始第2个函数。

同样的代码,你们的执行效果可能会跟我有所差异,因为效果是根据系统当前的状况去随机分配的,但并不影响你能看出来它的结果是多线程在进行。

最后补充一下,前面我们讲过Process里面有args和kwargs可进行参数传递,args是普遍参数的传递,kwargs是以字典的形式进行参数传递,我们还是以上面的代码为例,进行一下有参数传递的多进行。

2.获取当前进程的编号

前面我们讲到了代码执行时有多个进程在同时进行任务,那么怎么样查看当前进程的编号来得知目前有哪些进程在运行呢?哪些是主进程哪些是子进程呢?3个方法,我们先来看一下方法,后面再结合例子一起使用。

(1)获取当前进程的编号:

需要用到一个os模块里面的getpid()方法,用法如下:

os.getpid()

(2)获取当前进程的名字

这里用的还是multiprocessing包,里面有个current_process()的方法,用法如下:

multiprocessing.current_process()

(3)获取当前父进程(主进程)的编号

子进程是属于哪个父进程的?这个用的是os模块里面的getppid() ,用法如下:

os.getppid()

那么方法都看到了,我们来在刚才的例子的基础上,获取并打印一下当前进程的名字、编号以及父进程的编号。

import time
import multiprocessing
import os


# 2个要同时执行的函数
def music():
    print("music子进程名字:", multiprocessing.current_process())
    print("music子进程编号:", os.getpid())
    print("music所属主进程的编号:", os.getppid())

    for i in range(5):  # 执行5次
        print("听音乐中...")
        time.sleep(0.2)  # 延迟0.2s,目的是让效果对比更明显一些


def movie(a, b):
    print("movie子进程名字:", multiprocessing.current_process())
    print("movie子进程编号:", os.getpid())
    print("movie所属主进程的编号:", os.getppid())
    for i in range(5):
        print("看视频中...")
        time.sleep(0.2)  # 延迟0.2s


if __name__ == "__main__":  # 解决Windows系统下调用包时的递归问题
    # 创建子进程
    music_process = multiprocessing.Process(target=music)
    movie_process = multiprocessing.Process(target=movie, kwargs={"a": 30, "b": 40})

    # 启用进程
    music_process.start()
    movie_process.start()

    print("主进程编号:",os.getpid())

运行结果:

可以只要我们使用获取线程的方法的线程,都能被打印出来编号和名字。

三、多线程Threading模块

多进程能同时运行几个任务,前面我们讲过进程的最小单位是线程,那么线程也同样可以进行多个任务。如果一个进程只有1个任务(主进程),那么也可以说是只有1个线程,就比如我们不使用多进程运行代码的时候,这时候就可以说1个主进程或1个主线程。

1.多线程的类Thread类

多线程常用的一个模块是threading,里面有个教Thread的类,跟前面我们将多进程时用到的Process类差不多,我们先来看看用法:

Thread(target=None,name=None,args=(),kwargs=None)
  • target:可执行目标
  • name:线程的名字默认Thread-N
  • args/kwargs:目标参数

同样的,多线程也要有开启的方法,跟前面的也差不多:

start()

还有获取线程名字的方法:

threading.current_thread()

知道了这些知识点,我们开始举例:用跟上面差不多的例子去使用一下我们的多线程。

import threading,time

def music(name,loop):
    for i in range(loop):
        print("听音乐 %s , 第%s次"%(name,i))
        time.sleep(0.2)

def movie(name,loop):
    for i in range(loop):
        print("看电影%s , 第%s次"%(name,i))
        time.sleep(0.2)

if __name__ =="__main__":
    music_thread = threading.Thread(target=music,args=("最亲的人",3))
    movie_thread = threading.Thread(target=movie,args=("唐探2",3))
    music_thread.start()
    movie_thread.start()
    print("主线程执行完毕")

运行结果:

听音乐 最亲的人 , 第0次
看电影唐探2 , 第0次
主线程执行完毕
听音乐 最亲的人 , 第1次看电影唐探2 , 第1次

看电影唐探2 , 第2次听音乐 最亲的人 , 第2次

可以看出来,我们的多线程其实是跟多进程差不多的,同样可以运行多个任务,这里我们还增加了参数的使用。

2.继承Thread类

我们除了用上面的方法实现多线程任务,还可以用继承类的方式去实现多线程。

举例:通过多线程的方式,去打印“凉凉”和“头发没了"。

import threading,time

#多线程的创建
class MyThread(threading.Thread):
    def __init__(self,name):    #初始化
        super().__init__()  #调用父类Thread的初始化方法
        self.name = name    #name变成实例属性
    def run(self):
        #线程要做的事情
        for i in range(5):
            print(self.name)
            time.sleep(0.2)
 #实例化子线程
t1 = MyThread("凉凉")
t2 = MyThread("头发没了")

t1.start()
t2.start()

MyThread这个类是我们自己创建的,它是继承于父类threading.Thread ,同时我们需要写上MyThread的初始化方法,每当被调用的时候把准备工作做好,super().int() 这个我们也讲过了,在前面的面向对象时有讲过,不懂的可以去看看面向对象那篇文章的内容。

运行结果:

凉凉
头发没了
凉凉
头发没了
凉凉头发没了

凉凉头发没了

凉凉
头发没了

随机效果是有的,你们的效果和我的可能会不一样,每台电脑在运行多线程代码时,哪个线程能够抢到时间片谁就先执行。

通过类Thread继承一样可以实现多线程。

结语

进程线程讲完之后,基本上Python入门的所有知识点都讲完了,剩下的就是一章附加文章了。基本上从开始的Python基础到后面的高级编程板块的内容,如果你学完了,你去进阶Python的任何方向都是OK的,加油!

相关推荐

搜狗输入法2020版下载(搜狗输入法 下载)
  • 搜狗输入法2020版下载(搜狗输入法 下载)
  • 搜狗输入法2020版下载(搜狗输入法 下载)
  • 搜狗输入法2020版下载(搜狗输入法 下载)
  • 搜狗输入法2020版下载(搜狗输入法 下载)
qq好友恢复中心官方网站(qq好友恢复官方网站入口)
  • qq好友恢复中心官方网站(qq好友恢复官方网站入口)
  • qq好友恢复中心官方网站(qq好友恢复官方网站入口)
  • qq好友恢复中心官方网站(qq好友恢复官方网站入口)
  • qq好友恢复中心官方网站(qq好友恢复官方网站入口)
优酷app正版下载(下载优酷官方正版)

可能是网络连接不稳定或者应用商店服务器出现了问题导致无法正常下载。建议您检查网络连接是否正常,并尝试在其他应用商店中搜索并下载该应用。如果仍然无法下载,建议联系手机厂商或者应用商店客服寻求帮助解决。1...

热门小说排行榜(谷歌热门小说排行榜)

1.我吃西红柿:星辰变盘龙九鼎记2.血红:人途逍行纪邪龙道神机鬼藏邪风曲3.唐家三少:斗罗大陆琴帝4.辰东:神墓长生界不死不灭5.流浪的蛤蟆:仙葫6.烽火戏诸侯:极品公子陈二狗的妖孽人生7.跳舞:恶魔...

免费音乐下载网站mp3(免费音乐下载)

有免费下载mp3的网站。除了知名的几个音乐平台外,还有以下三款支持免费MP3无损音乐下载网站,可以将喜欢的歌曲下载到U盘。说明书里有呀91flac音乐网,试试这个,绝对好使,但是不要在酷狗上面说下载最...

印章在线生成(电子印章在线生成)

1、绘制外框先打开我们的Word文档,然后选择【插入】-【形状】-【椭圆】,在空白文档处绘制圆形外框,按住【Shift】就可以绘制正圆,绘制完成后选择【填充】-【无填充】,【轮廓】-【红色】,将线条粗...

一个手机号可以注册几个qq(一个手机号可以注册几个微信号)

可以注册多个QQ号方法如下:1、退出当前QQ,在登录界面点击“新用户注册”。2、输入本机的手机号码,点击下一步。3、输入手机接收到的验证码。4、点击“继续注册”。5、点击“不绑定”。6、输入新QQ昵称...

迷你世界官方版(迷你世界官方版官网入口)

我在官网上下载迷你世界的话,你需要进入浏览器网上下载APP进行下载迷你官网登录时候显示冻结可能是输密码错了好多几次导致的关于您的迷你世界账号被冻结了,可以添加官方联络方式或进行在线投诉建议等进行人...

浩辰cad看图王(浩辰cad看图王电脑版)

多。浩辰cad看图王相比于其他cad看图软件,拥有更多的功能可以使用。它不仅可以用来看图,还拥有图纸测量、添加标注、添加线条、文字等功能。解决方法如下:1、打开浩辰cad,输入一个命令,可以发现光标旁...

打字赚钱一单一结(打字赚钱一单一结app排行榜前十名)

以下是一些可以用于打字接单的App:1.蓝鲸输入法:这是一款功能强大的输入法工具,内置了打字接单功能,可以在输入法中直接接单并进行打字工作。2.有道云笔记:这是一款综合性笔记工具,在其中可以创建任...

ai换脸(ai换脸下载)
  • ai换脸(ai换脸下载)
  • ai换脸(ai换脸下载)
  • ai换脸(ai换脸下载)
  • ai换脸(ai换脸下载)
免费自动连接wifi(最新万能钥匙安全免费自动连接)
免费自动连接wifi(最新万能钥匙安全免费自动连接)

大多数安卓手机都是支持自动连接免费wifi的。同时,为了安全起见,也有对应的选项:检查wifi安全性。这个可以开启的。当然如果只是经常使用常用地点的wifi,这个可以关闭。关闭方法以三星手机为例:进入“设置”,“连接”,“wlan”,“右上...

2026-02-01 02:43 off999

画图工具(画图工具在电脑哪里)
画图工具(画图工具在电脑哪里)

常用的绘图软件有以下这些:1、Coreldraw。Coreldraw是一个绘图和排版软件,主要处理矢量文件。主要用于商标设计、标志制作、模型绘制、插图绘制、排版、分色输出。它在艺术设计和商业设计领域非常流行。2、Photoshop。最强大...

2026-02-01 02:15 off999

qq加速器(Bill bill加速器)

可能原因如下:1、官方服务器正在更新升级,为了给用户更好的体验,系统的维护是必不可少的。2、可以检查是否是网络出现了问题,可以更换网络是否正常。3、很多软件都在维护,包括QQ,微信,微博等,只能是等维...

进入qq安全中心的官网(qq安全中心入口)

1、以电脑版QQ为例,成功登录QQ后,点击界面左下角的“主菜单”图标;2、在弹出框里点击“安全”,再在右边的弹出框里点击“安全中心首页”;3、就会跳转到QQ安全中心的网页了,在里面进行修改密码、我的密...

取消回复欢迎 发表评论: