我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何分析Python多进程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何分析Python多进程

这篇文章将为大家详细讲解有关如何分析Python多进程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

1.Python多进程模块

Python中的多进程是通过multiprocessing包来实现的,和多线程的threading.Thread差不多,它可以利用multiprocessing.Process对象来创建一个进程对象。这个进程对象的方法和线程对象的方法差不多也有start(), run(), join()等方法,其中有一个方法不同Thread线程对象中的守护线程方法是setDeamon,而Process进程对象的守护进程是通过设置daemon属性来完成的。

下面说说Python多进程的实现方法,和多线程类似

2.Python多进程实现方法一

from multiprocessing import  Processdef fun1(name):    print('测试%s多进程' %name)if __name__ == '__main__':    process_list = []    for i in range(5):  #开启5个子进程执行fun1函数        p = Process(target=fun1,args=('Python',)) #实例化进程对象        p.start()        process_list.append(p)    for i in process_list:        p.join()    print('结束测试')

结果

测试Python多进程
测试Python多进程
测试Python多进程
测试Python多进程
测试Python多进程
结束测试
Process finished with exit code 0

上面的代码开启了5个子进程去执行函数,我们可以观察结果,是同时打印的,这里实现了真正的并行操作,就是多个CPU同时执行任务。我们知道进程是python中最小的资源分配单元,也就是进程中间的数据,内存是不共享的,每启动一个进程,都要独立分配资源和拷贝访问的数据,所以进程的启动和销毁的代价是比较大了,所以在实际中使用多进程,要根据服务器的配置来设定。

3.Python多进程实现方法二

还记得python多线程的第二种实现方法吗?是通过类继承的方法来实现的,python多进程的第二种实现方式也是一样的

from multiprocessing import  Processclass MyProcess(Process): #继承Process类    def __init__(self,name):        super(MyProcess,self).__init__()        self.name = name    def run(self):        print('测试%s多进程' % self.name)if __name__ == '__main__':    process_list = []    for i in range(5):  #开启5个子进程执行fun1函数        p = MyProcess('Python') #实例化进程对象        p.start()        process_list.append(p)    for i in process_list:        p.join()    print('结束测试')

结果

测试Python多进程
测试Python多进程
测试Python多进程
测试Python多进程
测试Python多进程
结束测试
Process finished with exit code 0

效果和第一种方式一样。

我们可以看到Python多进程的实现方式和多线程的实现方式几乎一样。

Process类的其他方法

构造方法:

Process([group [, target [, name [, args [, kwargs]]]]])

group: 线程组 

target: 要执行的方法

name: 进程名

args/kwargs: 要传入方法的参数

实例方法:

is_alive():返回进程是否在运行,bool类型。

join([timeout]):阻塞当前上下文环境的进程程,直到调用此方法的进程终止或到达指定的timeout(可选参数)。

start():进程准备就绪,等待CPU调度

run():strat()调用run方法,如果实例进程时未制定传入target,这star执行t默认run()方法。

terminate():不管任务是否完成,立即停止工作进程

属性:

daemon:和线程的setDeamon功能一样

name:进程名字

pid:进程号

关于join,daemon的使用和python多线程一样,这里就不在复述了。

4.Python多线程的通信

进程是系统独立调度核分配系统资源(CPU、内存)的基本单位,进程之间是相互独立的,每启动一个新的进程相当于把数据进行了一次克隆,子进程里的数据修改无法影响到主进程中的数据,不同子进程之间的数据也不能共享,这是多进程在使用中与多线程最明显的区别。但是难道Python多进程中间难道就是孤立的吗?当然不是,python也提供了多种方法实现了多进程中间的通信和数据共享(可以修改一份数据)

进程对列Queue

Queue在多线程中也说到过,在生成者消费者模式中使用,是线程安全的,是生产者和消费者中间的数据管道,那在python多进程中,它其实就是进程之间的数据管道,实现进程通信。

from multiprocessing import Process,Queuedef fun1(q,i):    print('子进程%s 开始put数据' %i)    q.put('我是%s 通过Queue通信' %i)if __name__ == '__main__':    q = Queue()    process_list = []    for i in range(3):        p = Process(target=fun1,args=(q,i,))  #注意args里面要把q对象传给我们要执行的方法,这样子进程才能和主进程用Queue来通信        p.start()        process_list.append(p)    for i in process_list:        p.join()    print('主进程获取Queue数据')    print(q.get())    print(q.get())    print(q.get())    print('结束测试')

结果

子进程0 开始put数据
子进程1 开始put数据
子进程2 开始put数据
主进程获取Queue数据
我是0 通过Queue通信
我是1 通过Queue通信
我是2 通过Queue通信
结束测试
Process finished with exit code 0

上面的代码结果可以看到我们主进程中可以通过Queue获取子进程中put的数据,实现进程间的通信。

管道Pipe

管道Pipe和Queue的作用大致差不多,也是实现进程间的通信,下面之间看怎么使用吧

from multiprocessing import Process, Pipedef fun1(conn):    print('子进程发送消息:')    conn.send('你好主进程')    print('子进程接受消息:')    print(conn.recv())    conn.close()if __name__ == '__main__':    conn1, conn2 = Pipe() #关键点,pipe实例化生成一个双向管    p = Process(target=fun1, args=(conn2,)) #conn2传给子进程    p.start()    print('主进程接受消息:')    print(conn1.recv())    print('主进程发送消息:')    conn1.send("你好子进程")    p.join()    print('结束测试')

结果

主进程接受消息:
子进程发送消息:
子进程接受消息:
你好主进程
主进程发送消息:
你好子进程
结束测试
Process finished with exit code 0

上面可以看到主进程和子进程可以相互发送消息

Managers

Queue和Pipe只是实现了数据交互,并没实现数据共享,即一个进程去更改另一个进程的数据。那么久要用到Managers

from multiprocessing import Process, Managerdef fun1(dic,lis,index):    dic[index] = 'a'    dic['2'] = 'b'        lis.append(index)    #[0,1,2,3,4,0,1,2,3,4,5,6,7,8,9]    #print(l)if __name__ == '__main__':    with Manager() as manager:        dic = manager.dict()#注意字典的声明方式,不能直接通过{}来定义        l = manager.list(range(5))#[0,1,2,3,4]        process_list = []        for i in range(10):            p = Process(target=fun1, args=(dic,l,i))            p.start()            process_list.append(p)        for res in process_list:            res.join()        print(dic)        print(l)

结果:

{0: 'a', '2': 'b', 3: 'a', 1: 'a', 2: 'a', 4: 'a', 5: 'a', 7: 'a', 6: 'a', 8: 'a', 9: 'a'}
[0, 1, 2, 3, 4, 0, 3, 1, 2, 4, 5, 7, 6, 8, 9]

可以看到主进程定义了一个字典和一个列表,在子进程中,可以添加和修改字典的内容,在列表中插入新的数据,实现进程间的数据共享,即可以共同修改同一份数据

5.进程池

进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。就是固定有几个进程可以使用。

进程池中有两个方法:

  • apply:同步,一般不使用

  • apply_async:异步

from  multiprocessing import Process,Poolimport os, time, randomdef fun1(name):    print('Run task %s (%s)...' % (name, os.getpid()))    start = time.time()    time.sleep(random.random() * 3)    end = time.time()    print('Task %s runs %0.2f seconds.' % (name, (end - start)))if __name__=='__main__':    pool = Pool(5) #创建一个5个进程的进程池    for i in range(10):        pool.apply_async(func=fun1, args=(i,))    pool.close()    pool.join()    print('结束测试')

结果

Run task 0 (37476)...
Run task 1 (4044)...
Task 0 runs 0.03 seconds.
Run task 2 (37476)...
Run task 3 (17252)...
Run task 4 (16448)...
Run task 5 (24804)...
Task 2 runs 0.27 seconds.
Run task 6 (37476)...
Task 1 runs 0.58 seconds.
Run task 7 (4044)...
Task 3 runs 0.98 seconds.
Run task 8 (17252)...
Task 5 runs 1.13 seconds.
Run task 9 (24804)...
Task 6 runs 1.46 seconds.
Task 4 runs 2.73 seconds.
Task 8 runs 2.18 seconds.
Task 7 runs 2.93 seconds.
Task 9 runs 2.93 seconds.
结束测试

对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。

进程池map方法

案例来源于网络,侵权请告知,谢谢

因为网上看到这个例子觉得不错,所以这里就不自己写案例,这个案例比较有说服力

import os import PIL from multiprocessing import Pool from PIL import ImageSIZE = (75,75)SAVE_DIRECTORY = \'thumbs\'def get_image_paths(folder):    return (os.path.join(folder, f)             for f in os.listdir(folder)             if \'jpeg\' in f)def create_thumbnail(filename):     im = Image.open(filename)    im.thumbnail(SIZE, Image.ANTIALIAS)    base, fname = os.path.split(filename)     save_path = os.path.join(base, SAVE_DIRECTORY, fname)    im.save(save_path)if __name__ == \'__main__\':    folder = os.path.abspath(        \'11_18_2013_R000_IQM_Big_Sur_Mon__e10d1958e7b766c3e840\')    os.mkdir(os.path.join(folder, SAVE_DIRECTORY))    images = get_image_paths(folder)    pool = Pool()    pool.map(creat_thumbnail, images) #关键点,images是一个可迭代对象    pool.close()    pool.join()

上边这段代码的主要工作就是将遍历传入的文件夹中的图片文件,一一生成缩略图,并将这些缩略图保存到特定文件夹中。这我的机器上,用这一程序处理 6000 张图片需要花费 27.9 秒。 map 函数并不支持手动线程管理,反而使得相关的 debug 工作也变得异常简单。

map在爬虫的领域里也可以使用,比如多个URL的内容爬取,可以把URL放入元祖里,然后传给执行函数。

关于如何分析Python多进程就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何分析Python多进程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何分析Python多进程

这篇文章将为大家详细讲解有关如何分析Python多进程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.Python多进程模块Python中的多进程是通过multiprocessing包来实
2023-06-26

python多进程和VNPY多进程参数优化举例分析

这篇文章主要讲解了“python多进程和VNPY多进程参数优化举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python多进程和VNPY多进程参数优化举例分析”吧!首先,由于GIL(
2023-06-02

python爬虫中多线程和多进程的示例分析

小编给大家分享一下python爬虫中多线程和多进程的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于
2023-06-14

如何解析PHP多进程编程

这篇文章主要介绍了如何解析PHP多进程编程,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。PHP多进程编程使用多进程的优点: 1. 使用多进程, 子进程结束以后, 内核会
2023-06-14

如何进行Java多线程语句具体分类的分析

如何进行Java多线程语句具体分类的分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Java多线程语句中有很多的小的语句需要我们特殊的注意。wait(),notify(
2023-06-17

如何进行Python 字符串分析

今天就跟大家聊聊有关如何进行Python 字符串分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.for重新实现:1+2+3…+100=? 运行结果: Python代码: 点击(
2023-06-04

Python进程池与进程锁实例分析

本篇内容主要讲解“Python进程池与进程锁实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python进程池与进程锁实例分析”吧!进程池什么是进程池上一章节关于进程的问题我们提到过,进程
2023-06-29

如何用Python进行回归分析与相关分析

这篇文章主要介绍了如何用Python进行回归分析与相关分析,这两部分内容会放在一起讲解,文中提供了解决思路以及部分实现代码,需要的朋友可以参考下
2023-03-22

Python多线程实例分析

这篇文章主要介绍“Python多线程实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python多线程实例分析”文章能帮助大家解决问题。线程讲解  多线程类似于同时执行多个不同程序,多线程运行
2023-06-29

Python实现多进程共享数据的方法分析

本文实例讲述了Python实现多进程共享数据的方法。分享给大家供大家参考,具体如下: 示例一:# -*- coding:utf-8 -*- from multiprocessing import Process, Manager impor
2022-06-04

深入浅析python中的多进程、多线程、协程

进程与线程的历史我们都知道计算机是由硬件和软件组成的。硬件中的CPU是计算机的核心,它承担计算机的所有任务。 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配、任务的调度。 程序是运行在系统上的具有某种功能的软件,比
2022-06-04

如何分析Python多线程在爬虫中的应用

本篇文章为大家展示了如何分析Python多线程在爬虫中的应用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。作为测试工程师经常需要解决测试数据来源的问题,解决思路无非是三种:1、直接从生产环境拷贝真实
2023-06-04

python多进程

第一种开启进程方式#!/usr/bin/python# -*- coding:utf-8 -*-from multiprocessing import Processimport time, random, os# print(os.cpu
2023-01-31

Python -- 多进程

进程通信方式一、共享内存(进程安全,效率高)共享变量:multiprocessing.Value共享数组:multiprocessing.Array  方式二、Manager对象:Mananger 包括:list, dict, Namesp
2023-01-31

如何进行Bash和Python编程语言优缺点分析

如何进行Bash和Python编程语言优缺点分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Bash 和 Python 是大多数自动化工程师最喜欢的编程语言。
2023-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录