Python进程和线程保姆式教学,1个台机子多只手干活的秘籍
off999 2024-10-27 11:55 14 浏览 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的,加油!
相关推荐
- Python自动化脚本应用与示例(python自动化脚本教程)
-
Python是编写自动化脚本的绝佳选择,因其语法简洁、库丰富且跨平台兼容性强。以下是Python自动化脚本的常见应用场景及示例,帮助你快速上手:一、常见自动化场景文件与目录操作O批量重命名文件...
- 如何使用Python实现一个APP(如何用python做一个程序)
-
要使用Python实现一个APP,你可以选择使用一些流行的移动应用开发框架,如Kivy、PyQt或Tkinter。这里以Kivy为例,它是一个跨平台的Python框架,可以用于创建漂亮的图形用户界面(...
- 免费定时运行Python程序并存储输出文档的服务推荐
-
免费定时运行Python程序并存储输出文档的服务推荐以下是几种可以免费定时运行Python程序并存储输出结果的云服务方案:1.PythonAnywhere特点:提供免费的Python托管环境支持定时...
- 【Python程序开发系列】如何让python脚本一直在后台保持运行
-
这是我的第385篇原创文章。一、引言让Python脚本在后台持续运行,有几种常见的方式,具体方式可以根据你的系统环境和需求选择。二、Linux或macOS系统2.1使用nohup命令no...
- 运行和执行Python程序(运行python的程序)
-
一、Python是一种解释型的脚本编程语言,这样的编程语言一般支持两种代码运行方式:交互式编程在命令行窗口中直接输入代码,按下回车键就可以运行代码,并立即看到输出结果;执行完一行代码,你还可以继续...
- Python 初学者指南:计算程序的运行时长
-
在编写Python程序时,了解程序的运行时长是一项很有用的技能。这不仅能帮助你评估代码的效率,还能在优化程序性能时提供关键的数据支持。对于初学者来说,计算程序运行时长其实并不复杂,接下来就让我们看...
- pyest+appium实现APP自动化测试,思路全总结在这里
-
每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试码同学抖音号:小码哥聊软件测试01appium环境搭建安装nodejshttp://nodej...
- 血脉觉醒后,编程小白我是如何通过Deepseek和Trae轻松开发软件的
-
以下就是作为一个编程小白的我,是如何一步步开发软件的保姆级教程,请点赞收藏:第一步:打开#deepseek#(首先关闭深度思考和联网搜索)输入或复制你要让它做一个什么样软件的要求和提示词(你可以先用...
- 我用Deepseek+Trae写的python小软件,小白也能轻松用上模型啦!
-
利用AI大模型deepseek,搭配TraeCN,用半个小时做了一个本地Ollama安装部署和一键卸载的小工具,哈哈哈!感觉还不错#deepseek#一直想做一个本地Ollama安装部署和一键卸载...
- 在安卓设备上运行Python的方法(安卓能运行python吗)
-
技术背景在安卓设备上运行Python可以为开发者提供更多的开发选择和灵活性,能够利用Python丰富的库和简洁的语法来开发各种应用,如游戏、脚本工具等。然而,由于安卓系统原生不支持Python,需要借...
- 零基础小白,DeepSeek全自动编程,超详细提示词,一键生成软件!
-
我前面发表了文章,详细说了编程零基础小白,如何利用DeepSeek进行编程的全过程,感兴趣的可以去看看:DeepSeek全自动编程很多人不会写提示词,不知道怎么开始对话。话不多说,请先看下图中的对话,...
- 小白用DeepSeek+Python编写软件(用python制作软件)
-
周末无事,用DeepSeek生成全部代码,写了一个mp3音乐播放器,几分钟搞定,DeepSeek确实太强大了。我的提示语是这么写的:“请用Python语言写一个音乐播放器,支持常见音乐格式,我是Pyt...
- 零基础使用DeepSeek开发Windows应用程序,超简单超实用!
-
你敢相信,我居然用DeepSeek开发了一个能用的Windows软件!整个过程就像和学霸同桌组队做作业,我负责提需求,DeepSeek负责写代码改bug,全程碰到任何问题直接丢给DeepSeek即可。...
- 第二篇:如何安装Python并运行你的第一个程序
-
欢迎回到我的Python入门教程系列!在上一篇中,我们讨论了为什么Python是一门值得学习的编程语言。今天,我们将迈出第一步:安装Python并运行你的第一个程序。无论你是Windows、macOS...
- Python 运行,带你找入口,快速读懂程序
-
有C或Java编程开发经验的软件开发者,初次接触python程序,当你想快速读懂python项目工程时,是否觉得python程序有些太过随意,让你看有些无所适从,进而有些茫然。这是...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Python自动化脚本应用与示例(python自动化脚本教程)
- 如何使用Python实现一个APP(如何用python做一个程序)
- 免费定时运行Python程序并存储输出文档的服务推荐
- 【Python程序开发系列】如何让python脚本一直在后台保持运行
- 运行和执行Python程序(运行python的程序)
- Python 初学者指南:计算程序的运行时长
- pyest+appium实现APP自动化测试,思路全总结在这里
- 血脉觉醒后,编程小白我是如何通过Deepseek和Trae轻松开发软件的
- 我用Deepseek+Trae写的python小软件,小白也能轻松用上模型啦!
- 在安卓设备上运行Python的方法(安卓能运行python吗)
- 标签列表
-
- python计时 (54)
- python安装路径 (54)
- python类型转换 (75)
- python进度条 (54)
- python的for循环 (56)
- python串口编程 (60)
- python写入txt (51)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python字典增加键值对 (53)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python qt (52)
- python人脸识别 (54)
- python斐波那契数列 (51)
- python多态 (60)
- python命令行参数 (53)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- centos7安装python (53)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)