您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦

本篇重点介绍Python多进程的使用,读者朋友们可以将多进程和多线程两者做一个对比学习。

干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。

前言

前面我们介绍了多线程的使用,这篇文章将来学习多进程的使用。

进程的创建

Python的multiprocessing模块提供了Process类,该类可用来在各平台下创建新进程。其构造函数是:

__init__(self, group=None, target=None, name=None, args=(), kwargs={})

其中,各个参数的含义如下:

  1. group: 该参数未实现,不需要传参
  2. target:为新建进程指定执行任务,也就是指定一个函数
  3. args:以元组的方式,为target指定的方法传递参数,如果传入的是元组中有多个参数的话则传入方式是(arg1,arg2,....argn,)
  4. kwargs:以字典的方法,为target指定的方法传递参数。
  5. name: 为新建进程设置名称

一些常用方法介绍

  1. start() 方法用于启动进程
  2. run() 方法用于运行所要执行的任务
  3. is_alive() 方法用于判断当前进程是否还活着
  4. getPid() 方法用于获取进程的ID号。

1.直接创建Process类的实例对象,由此就可以创建一个新的进程;

这个就类似于直接创建实例化线程Thread类

from multiprocessing import Process
import os
# 定义要调用的方法
def async_fun(name, add):
for arc in add:
print(name + str(os.getpid()) + " " + arc) if __name__ == '__main__':
my_tuple = ("码农飞哥", "今天是宅家的一天", "30岁了还没对象焦虑呀") # 创建进程
process = Process(target=async_fun, args=("子进程", my_tuple))
# 启动子进程
process.start()
# 启动主进程
async_fun("主进程", my_tuple)

运行结果是:

主进程11610 码农飞哥
主进程11610 今天是宅家的一天
主进程11610 30岁了还没对象焦虑呀
子进程11612 码农飞哥
子进程11612 今天是宅家的一天
子进程11612 30岁了还没对象焦虑呀

这里需要注意的一点是,必须要将代码放在if __name__ == '__main__': 代码块中。通过os.getpid()方法来获取进程号。

2.通过继承Process类的子类,创建实例对象,也可以创建新的进程。

第二种方式就是通过继承Process类的子类,创建实例对象,也可以创建新的进程,不过这种方式需要重写父类的run()方法。这种方法就类似于直接继承Thread类创建线程。

import multiprocessing
import os # 定义要调用的方法
def async_fun(name, add):
for arc in add:
print(name + str(os.getpid()) + " " + arc) class MyProcess(multiprocessing.Process):
def __init__(self, name, add):
multiprocessing.Process.__init__(self)
self.add = add
self.name = name
# 重写run()方法 def run(self):
async_fun(self.name, self.add) if __name__ == '__main__':
my_tuple = ("码农飞哥", "今天是宅家的一天", "宅家也不能虚度")
myprocess = MyProcess("子进程", my_tuple)
myprocess.start()
# 主进程
async_fun("主进程", my_tuple)

运行结果同上。

这里还是推荐使用第一种方法创建进程,因为这种方式创建进程比较简洁

进程池的使用

由于创建进程对系统的开销比较大。所以,所以在实际开发中一般都会使用进程池来创建进程。进程池的使用与线程池的使用也是有神似的地方。同样的在multiprocessing模块中提供了Pool函数来创建进程池。

import os
from multiprocessing import Pool
import time # 定义要调用的方法
def async_fun(add):
time.sleep(1)
print("进程号:" + str(os.getpid()) + " " + add) if __name__ == '__main__':
add = "码农飞哥,今天是宅家的一天,30岁了还没对象焦虑呀"
# 创建包含4个进程的进程池
pool = Pool(processes=4)
# 提交action
pool.apply_async(func=async_fun, args=(add,))
pool.apply_async(func=async_fun, args=("加油加油",))
pool.close()
pool.join()

运行结果是:

进程号:11658 码农飞哥,今天是宅家的一天,30岁了还没对象焦虑呀
进程号:11659 加油加油

同样的进程池也可以通过with语句来创建

from multiprocessing import Pool
import os
import time def async_add(max):
time.sleep(1)
print("进程号:" + str(os.getpid()) + "最大值是" + str(max)) if __name__ == '__main__':
with Pool(processes=4) as pool:
# 使用线程池执行max计算
results = pool.map(async_add, (20, 30, 40, 50))

运行结果是:

进程号:11726最大值是20
进程号:11725最大值是30
进程号:11727最大值是40
进程号:11728最大值是50

多进程和多线程的优缺点对比

多进程的优点就是稳定性好,一个子进程崩溃了,不会影响主进程以及其余子进程,各个子进程各用一套独立的内存空间。多线程的优点就是效率高,适用于批处理等功能。

多进程的缺点就是创建进程的代价非常大,因为操作系统要给每个进程分配固定的资源,并且操作系统对进程的总数会有一定的限制,若进程过多,操作系统调度都会存在问题,会造成假死状况。

总结

本文详细介绍了Python多进程的使用。

Python知识图谱

为了更好帮助更多的小伙伴对Python从入门到精通,我从CSDN官方那边搞来了一套 《Python全栈知识图谱》,尺寸 870mm x 560mm,展开后有一张办公桌大小,也可以折叠成一本书的尺寸,有兴趣的小伙伴可以了解一下------扫描下图中的二维码即可购买。



我本人也已经用上了,感觉非常好用。图谱桌上放,知识心中留。

我是码农飞哥,再次感谢您读完本文

全网同名【码农飞哥】。不积跬步,无以至千里,享受分享的快乐

我是码农飞哥,再次感谢您读完本文

【Python从入门到精通】(二十五)Python多进程的使用的更多相关文章

  1. 二十五. Python基础(25)--模块和包

    二十五. Python基础(25)--模块和包 ● 知识框架   ● 模块的属性__name__ # my_module.py   def fun1():     print("Hello& ...

  2. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

  3. Scala入门到精通——第十五节 Case Class与模式匹配(二)

    本节主要内容 模式匹配的类型 for控制结构中的模式匹配 option类型模式匹配 1. 模式的类型 1 常量模式 object ConstantPattern{ def main(args: Arr ...

  4. Python学习之旅(二十五)

    Python基础知识(24):正则表达式 正则表达式:检查一个字符串是否与某个模式匹配 \d :匹配数字 \w :匹配字母或数字 . :匹配任意字符 {n} :匹配n个字符 {m,n} :匹配m到n个 ...

  5. Spring Boot 入门系列(二十五)读取配置文件的几种方式详解!

    在项目开发中经常会用到配置文件,之前介绍过Spring Boot 资源文件属性配置的方法,但是很多朋友反馈说介绍的不够详细全面.所以, 今天完整的分享Spring Boot读取配置文件的几种方式! S ...

  6. 二十五 Python分布式爬虫打造搜索引擎Scrapy精讲—Requests请求和Response响应介绍

    Requests请求 Requests请求就是我们在爬虫文件写的Requests()方法,也就是提交一个请求地址,Requests请求是我们自定义的 Requests()方法提交一个请求 参数: ur ...

  7. Swift从入门到精通第十五篇 - 类型转换 初识

    类型转换(学习笔记) 环境Xcode 11.0 beta4 swift 5.1 类型转换 类型转换是检查实例类型的一种方法,或者检查来自类层级不同的父类或子类一个实例,用 is 和 as 操作符 为类 ...

  8. Simulink仿真入门到精通(十五) Simulink在流程工业中的仿真应用

    15.1 工业乙醇生产与计算机仿真 乙醇作为可再生清洁能源不仅可以代替四乙基铅作为汽油的防爆剂,还可以制造汽油醇.这一巨大的潜在需求促使人们去寻找提高乙醇工业生产率的途径,使人们着手于发酵工程的研究. ...

  9. Simulink仿真入门到精通(十九) 总结回顾&自我练习

    从2019年12月27到2020年2月12日,学习了Simulink仿真及代码生成技术入门到精通,历时17天. 学习的比较粗糙,有一些地方还没理解透彻,全书梳理总结: Simulink的基础模块已基本 ...

  10. python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法

    python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...

随机推荐

  1. Docker与k8s的恩怨情仇(七)—— “服务发现”大法让你的内外交互原地起飞

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 第一章:Docker与k8s的恩怨情仇(一)-成为PaaS前浪的Cloud Foundry 第二章:Dock ...

  2. Leetcode_丑数问题

    1. 263. 丑数 给你一个整数 n ,请你判断 n 是否为 丑数 .如果是,返回 true :否则,返回 false . 丑数 就是只包含质因数 2.3 或 5 的正整数. 示例 1: 输入:n ...

  3. 我的第一个开源项目 Kiwis2 Mockserver

    我的第一个开源作品Kiwis2 Mock Server,目前公测中,欢迎大家提供宝贵意见. 代码:https://github.com/kiwis2/mockserver 主页:https://kiw ...

  4. Setup a Simple HTTP Proxy Server

    The host 10.21.3.69 has no H3C client, so it can't access the internet. With Tinyproxy, we can setuu ...

  5. Use Emacs as Personal Knowledge Base

    http://stackoverflow.com/questions/2014636/how-to-maintain-an-emacs-based-knowledge-base

  6. Convert a Private Project on bitbucket.com to a github Public Project

    Create a public repo on github, you can add README or License files on the master branch, suppose th ...

  7. 授予mysql的其他用户数据库的使用权限

    场景:不同的开发人员有不同的数据库的权限:也可适用于外包公司不同的开发权限. root用户登录数据库,命令行执行下面语句即可. grant select,delete,update,create,dr ...

  8. bluecms安装错误一记

    菜鸡兴致勃勃下载了bluecms1.6准备大干一番 环境 phpstudy mysql 5.7.26 apache 2.4.39 php 7.3.4 结果安装第四步发现个这个问题   开始还以为自己这 ...

  9. IOC概念和原理:BeanFactory 接口与ApplicationContext

    IOC(概念和原理)1.什么是 IOC(1)控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理(2)使用 IOC 目的:为了耦合度降低(3)做入门案例就是 IOC 实现2.IOC ...

  10. Spring中的@Transactional必须要了解的概念

    spring中的@Transactional基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷解决在开发中碰到的问题. 一般使用是通过如下代码对方法或接口或类注释: 1 @Transactio ...