python 多进程 提高运行效率

python 多进程 提高运行效率

python 是一种非常流行的编程语言,但是python 的效率却并不是非常的理想,这时候就非常有必要使用多进程来提高python 的运行效率。

导入多进程的模块

from multiprocessing import Process      # 多进程模块
from multiprocessing import current_process    # 获取当前进程号
import time

创建多个进程

方式一:

# 定义一个多进程运行的函数
def fun(n):
    time.sleep(3)             # 设置一个延时观察多进程的运行情况
    print("{}".format(n))
    print("当前进程号:",current_process().pid)    # 打印当前的进程号

if __name__ = "__main__":
    p = Process(target=fun,args=(3,))         # 输入的参数设置,如果只是一个参数时候必须加上逗号,不然会被解析为一个字符串或者数字
    p.start()         # 创建一个进程的内存空间
    p.join()          # 阻塞进程,等待子进程运行完成之后,再继续运行朱金城代码
    print("主进程运行结束,进程号{}".format(current_process().pid))   # 查看主进程号

方式二:

创建多个进程

class myProcess(Process):        # 继承多进程的模块
    def run(self):               # 替换多进程类中的run 函数
        print("start myProcess")
        time.sleep(2)
        print("end myProcess")
       
if __name__ = "__main__":
    p = myProcess()               # 创建一个子进程
    p.start()
    p.join()                       # 阻塞子进程等待子进程运行结束
    print("主进程运行结束")

ps: 查看当前进程号的另一种方法

import os
os.getpid();              # 当前进程的进程号
os.getppid();             # 当前进程的父进程的进程号

进程之间数据一般不能相互交互,需要相互交互时候,需要使用到第三方介质或者导入其他第三方库进行获取。

总结:
1.多个进程在内存中分别拥有着不同的区域,进程之间互不影响,同时也导致是数据不能共享。
2.多个进程分配到内存之后,几乎同时运行,不需要等待前面的结束才进行后面的进程,异步执行代码。
3、多进程由于同时运行,导致在读取数据以及修改数据时候会出现问题,添加互斥锁,使得一个时间点内只能有一个进程在修改数据,不会导致数据出现逻辑上的错误(将并发数据转变成为串行,牺牲效率,但是保证数据的安全)

from multiprocessing import Process, Lock   
import json

def change(i):
    with open("data.json","w") as f:
        json.dump(f,)            # 修改逻辑数据

def run(i,mutex):
    mutex.acquire()           # 抢锁
    change(i)
    mutex.release()           # 释放锁 
    

mutex = Lock()          # 新建一把互斥锁
for i in range(1,10):
    p = Process(target=run,args=(i,mutex))
    p.start()
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115139.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Ubuntu 18.04上安装cuda「建议收藏」

    Ubuntu 18.04上安装cuda「建议收藏」一、准备工作参照官网上资料,进行准备工作1.验证自己的电脑是否有一个可以支持CUDA的GPU$lspci|grep-invidia我的显示为TeslaP800ifitislistedinhttp://developer.nvidia.com/cuda-gpus,yourGPUisCUDA-capable2.验证自己的Linux版本是否支持…

    2022年9月2日
    4
  • Idea正则表达式一键替换注释,生成@ApiModelProperty(““)「建议收藏」

    平常日常开发中,返回给前端的vo对象在字段上需要加注释@ApiModelProperty(“xxx”),方便在前端同事在swagger文档看注释,一般我是domain对象生成之后,复制代码到vo对象里,然后再修改Java块注释为前端的注释@ApiModelProperty(“xxx”),那怎么从以下的代码注释转为@ApiModelProperty(“xxx”)注释呢?如果字段很多的话,一个一个写会比较耗时也枯燥,可以用正则表达式一键替。/***xxx*/(1)doma

    2022年4月14日
    160
  • Android 多线程编程实验_android UI线程

    Android 多线程编程实验_android UI线程线程的基本用法Android的多线程编程与Java多线程编程基本是使用相同的语法,比如定义一个线程只需要新建一个类继承自Thread,重写父类的run()方法classMyThread:Thread(){overridefunrun(){//编写具体的逻辑}}启动这个线程也很简单,创建MyThread的实例,调用start()方法,这样run()方法中的代码就会在子线程中运行了MyThread().start().

    2025年6月8日
    2
  • 一文就让你搞懂http和https的通信过程及区别

    一文就让你搞懂http和https的通信过程及区别

    2022年2月19日
    53
  • 递归迭代动态规划「建议收藏」

    递归迭代动态规划「建议收藏」一、定义递归:程序调用自身,从顶部将问题分解,其问题与其子问题是同一概念。通过解决掉所有分解出来的小问题,来解决整个问题。迭代:利用变量的原值推算出变量的下一个值。递归中一定有迭代,但是迭代中不一定有递归。动态规划:通常与递归相反,其从底部开始解决问题。将所有小问题解决掉,进而解决的整个问题。为了节约重复求相同子问题的时间,引入一个数组,把所有子问题的解存于该数组中,动态规划算法是空间换时间的算法。动态规划可以递归地实现,也可以非递归(循环的方法)地实现。运行速度:动态规划>迭代&gt

    2025年7月1日
    3
  • 大数据建模流程之数据处理[通俗易懂]

    大数据建模流程之数据处理[通俗易懂]原文链接数据是建模的基础,也是研究事物发展规律的材料。数据本身的可信度和处理的方式将直接决定模型的天花板在何处。一个太过杂乱的数据,无论用多么精炼的模型都无法解决数据的本质问题,也就造成了模型的效果不理想的效果。这也是我们目前所要攻克的壁垒。但是,目前我们市场对的数据或者科研的数据并不是完全杂乱无章的,基本都是有规律可循的,因此,用模型算法去进行科学的分析,可以主观情绪对决策的影响。所以数据是非常重要的一部分。那么,接下来我们就详细说一下数据的处理与分析。一.数据的基本特征当看到数据的时候,首要做的并

    2022年6月8日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号