返回顶部
首页 > 资讯 > 后端开发 > Python >python多进程基础详解
  • 891
分享到

python多进程基础详解

2024-04-02 19:04:59 891人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录进程开启一个进程JOIN方法进程之间空间隔离进程的常用方法current_process 查看pid(进程id)os.getpid() 查看进程id进程其他方法和属性守护进程互斥

进程

什么是进程
进程指的是一个程序的运行过程,或者说一个正在执行的程序
所以说进程一种虚拟的概念,该虚拟概念起源操作系统

一个CPU 同一时刻只能执行一件事

开启一个进程


from  multiprocessing import Process
import time
def task(name):
    print('%s is running'%name)
    time.sleep(3)
    print('%s is done'%name)
# 开启子进程的操作必须放到
# if __name__ == '__main__'的子代码中
# 子进程不会再次加载
if __name__ == '__main__':
    p=Process(target=task,args=('小王',))
    # p=Process(target=task,kwargs={'name':'小王'})
    # print(p)
    p.start()
    # 主进程只是向操作系统发送了一个开启子进程的信号
    # p.start()
    # 1.操作系统先申请内存空间
    # 2.把主进程的数据拷贝到子进程里面
    # 3.调用cup才能运行里面的代码
    # 创造进程的开销大
    print('主')

在这里插入图片描述

JOIN方法

当前进程jion别的进程。当前进程就会等到别的进程执行完毕了才会继续开始往下执行

在这里插入图片描述


from multiprocessing import Process
import time

def task(name, n):
    print('%s is running' % name)
    time.sleep(n)
    print('%s is done' % name)

if __name__ == '__main__':
    start = time.time()
    p_l = []
    for i in range(1, 4):
        p = Process(target=task, args=('小王%s' % i, i))
        p_l.append(p)
        p.start()
    # 主进程等待子进程
    for p in p_l:
        p.join()
    print('主', (time.time() - start))

进程之间空间隔离


from multiprocessing import  Process
# 这个n是主进程里面的值
n = 100
def task():
    global n
    # 改的是子进程里面的全局变量
    # 主进程里面没有改
    n = 0
if __name__ == '__main__':
    p=Process(target=task)
    p.start()
    p.join()
    print(n)

在这里插入图片描述

进程的常用方法

current_process 查看pid(进程id)


# 1. 进程pid:每一个进程在操作系统内都有一个唯一的id号,称之为pid
from multiprocessing import Process, current_process
import time

def task():
    print('%s is running' % current_process().pid)
    time.sleep(3)
    print('%s is done' % current_process().pid)

# 开启子进程的操作必须放到
# if __name__ == '__main__'的子代码中
# 子进程不会再次加载
if __name__ == '__main__':
    p = Process(target=task)
    p.start()
    print('主', current_process().pid)

在这里插入图片描述

os.getpid() 查看进程id


# os模块也可以
from multiprocessing import Process, current_process
import time, os

def task():
    print('%s is running 爹是%s' % (os.getpid(), os.getppid()))
    time.sleep(3)
    print('%s is done爹是%s' % (os.getpid(), os.getppid()))

# 开启子进程的操作必须放到
# if __name__ == '__main__'的子代码中
# 子进程不会再次加载
if __name__ == '__main__':
    p = Process(target=task)
    p.start()
    # 谁把主进程创造出来的
    #   用PyCharm就是pycharm创造的
    print('主%s爹是%s' % (os.getpid(), os.getppid()))

在这里插入图片描述

进程其他方法和属性


from multiprocessing import Process,current_process
import time,os
def task():
    print('%s is running 爹是%s'%(os.getpid(),os.getppid()))
    time.sleep(30)
    print('%s is done爹是%s'%(os.getpid(),os.getppid()))
# 开启子进程的操作必须放到
# if __name__ == '__main__'的子代码中
# 子进程不会再次加载
if __name__ == '__main__':
    p=Process(target=task)
    p.start()
    # 谁把主进程创造出来的
    # 用pycharm就是pycharm创造的
    # 进程的名字
    print(p.name)
    # 杀死子进程
    p.terminate()
    # 需要时间
    time.sleep(0.1)
    #  判断子进程是否存活
    print(p.is_alive())
    print('主%s爹是%s'%(os.getpid(),os.getppid()))

在这里插入图片描述

守护进程

本质就是一个"子进程",该"子进程"的生命周期<=被守护进程的生命周期
当被守护的进程执行完了。它也会被杀死


# 主进程运行完了,子进程没有存在的意义
# 皇帝和太监不是同生,但是是同死
from  multiprocessing import Process
import time
def task(name):
    print('%s活着'%name)
    time.sleep(3)
    print('%s正常死亡'%name)
if __name__ == '__main__':
    p1=Process(target=task,args=('老太监',))
    # 声明子进程为守护进程
    p1.daemon = True
    p1.start()
    time.sleep(1)
    print('皇帝正在死亡')

在这里插入图片描述

互斥锁

进程之间内存空间互相隔离,怎样实现共享数据
进程之间内存数据不共享,但是共享同一套文件系统,所以访问同一个文件,是没有问题的,
而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理


'''
抢票
    查票
    购票
互斥锁:
    在程序中进行加锁处理
    必须要释放锁下一个锁才能获取,所以程序在合适的时候必须要有释放锁
所以用文件来处理共享数据
    1.速度慢
    2.必须有互斥锁
'''
import JSON
import time,random
from multiprocessing import Process,Lock
# 查票
def search(name):
    with open('db.json','rt',encoding='utf-8')as f:
        dic = json.load(f)
    # 模拟查票时间
    time.sleep(1)
    print('%s 查看到余票为 %s'%(name,dic['count']))
# 购票
# 第二个get子进程不会是第一个get子进程修改后count的结果
# 加互斥锁,把这一部分并发变成串行,
# 但是牺牲了效率,保证了数据安全
def get(name):
    with open('db.json','rt',encoding='utf-8')as f:
        dic = json.load(f)
    if dic['count']>0:
        dic['count']-=1
        time.sleep(random.randint(1,3))
        with open('db.json', 'wt', encoding='utf-8')as f:
            json.dump(dic,f)
            print('%s 购票成功'%name)
    else:
        print('%s 查看到没有票了'%name)
def task(name,mutex):
    # 并发
    search(name)
    # 串行
    # 加互斥锁
    mutex.acquire()
    get(name)
    # 释放互斥锁
    mutex.release()
# if __name__ == '__main__':
#     for i in range(10):
#         p=Process(target=task,args=('路人%s'%i,))
#         p.start()
#         #  join只能将进程的任务整体变成串行
#         # 互斥锁可以局部串行
#         p.join()
#         # 数据安全,是指读的时候无所谓,写的(改的)时候必须安全
#         # 写的时候是串行,读的时候并发
# 加锁
if __name__ == '__main__':
    # 主进程加锁
    mutex=Lock()
    for i in range(10):
        # 锁传入子进程
        p=Process(target=task,args=('路人%s'%i,mutex))
        p.start()
        #  join只能将进程的任务整体变成串行
        # 互斥锁可以局部串行
        # p.join()
        # 数据安全,是指读的时候无所谓,写的(改的)时候必须安全
        # 写的时候是串行,读的时候并发

db.json 中只有10张票。如果没有加锁。则可能会出现票呗多卖的情况
在这里插入图片描述

进程间通信(IPC机制)


'''
速度快
锁问题解决
ipc机制
    进程彼此之间互相隔离,要实现进程间通信(IPC),
    multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的
    共享内存空间
    队列=管道+锁
'''
from  multiprocessing import Queue
# 占用的内存,最好小数据,消息数据,下载地址
# Queue(限制队列里面的个数)
# 先进先出
q=Queue(3)
# 添加
q.put('a')
q.put('b')
q.put({'x':2})
print('篮子满了')
# 队列满了,相当于锁了
# q.put({'x':2})
# 提取
print(q.get())
print(q.get())
print(q.get())
# # 队列为空,等待加入,也会阻塞,相当于锁了
print('队列为空')
print(q.get())

队列被取完了 后面的q.get() 会阻塞直到有新的元素。所以程序不会结束

在这里插入图片描述

JoinableQueue 来实现生产消费者

JoinableQueue#task_done()方法当队列里面没有元素会结束线程


'''
小王和小周每人生产10分包子和土豆丝
小戴和小杨一直吃,当队列里面没有食物时。终结进程
'''
import time, random
from multiprocessing import Process, JoinableQueue

def producer(name, food, q):
    for i in range(10):
        res = '%s%s' % (food, i)
        # 模拟生产数据的时间
        time.sleep(random.randint(1, 3))
        q.put(res)
        print('厨师%s生成了%s' % (name, res))

def consumer(name, q):
    while True:
        # 订单都没了还在等,队列里面空了
        res = q.get()
        # 模拟处理数据的时间
        time.sleep(random.randint(1, 3))
        print('吃货%s吃了%s' % (name, res))
        # 1每次完成队列取一次,往q.join() ,取干净了q.join()运行完
        q.task_done()

# 多个生产者和消费者
if __name__ == '__main__':
    q = JoinableQueue()
    # 生产者
    p1 = Process(target=producer, args=('小王', '包子', q))
    p3 = Process(target=producer, args=('小周', '土豆丝', q))
    # 消费者
    c1 = Process(target=consumer, args=('小戴', q))
    c2 = Process(target=consumer, args=('小杨', q))
    # #3.守护进程的作用: 主进程死了,消费者子进程也跟着死
    #     #把消费者变成守护进程
    c1.daemon = True
    c2.daemon = True
    p1.start()
    p3.start()
    c1.start()
    c2.start()
    p1.join()
    p3.join()
    # 2消费者task_done给q.join()发信号
    q.join()
    print('主')
    # 生产者运行完?1,2
    # 消费者运行完?1,2

当队列为空时,不会傻傻等待而是结束进程

在这里插入图片描述

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: python多进程基础详解

本文链接: https://lsjlt.com/news/137629.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python多进程基础详解
    目录进程开启一个进程JOIN方法进程之间空间隔离进程的常用方法current_process 查看pid(进程id)os.getpid() 查看进程id进程其他方法和属性守护进程互斥...
    99+
    2024-04-02
  • Python基础之进程详解
    目录一、前言二、基本用法三、创建单个进程四、创建多个进程五、进程池六、锁七、进程间通信八、信号量九、数据共享十、总结一、前言 进程,一个新鲜的字眼,可能有些人并不了解,它是系统某个运...
    99+
    2024-04-02
  • java多线程:基础详解
    目录Java内存模型主内存和工作内存的交互命令内存模型的原子性内存模型的可见性内存模型的有序性指令重排优化的底层原理valatile原理volatile与加锁的区别先行发生原则线程的...
    99+
    2024-04-02
  • py基础---多线程、多进程、协程
    目录 Python基础__线程、进程、协程 1、什么是线程(thread)? 2、什么是进程(process)? 3、进程和线程的区别...
    99+
    2023-01-31
    多线程 进程 基础
  • python多线程基础
    一、python多线程基础    python多线程主要涉及两个类:thread和threading,后者实际是对前者的封装,由于threading提供了更完善的锁机制,运用场景更多,重点学习了这个类的使用。threading.Thread...
    99+
    2023-01-31
    多线程 基础 python
  • Python基础之面向对象进阶详解
    目录面向对象三大特征介绍继承语法格式查看类的继承层次结构object根类dir()查看对象属性str()方法的重写多重继承MRO()super()获得父类定义多态特殊方法和重载运算符...
    99+
    2024-04-02
  • 详解python的网络编程基础
    目录一.什么是网络编程二.socket1.socket的基本语法2.与socket有关的一些函数服务端函数客户端函数公共函数三.程序需求服务端分析客户端分析四.代码升级加上通信循环&...
    99+
    2024-04-02
  • 深入了解Python的多线程基础
    目录线程多线程Python多线程创建线程GIL锁线程池总结线程 线程(Thread),有时也被称为轻量级进程(Lightweight Process,LWP),是操作系统独⽴调度和分...
    99+
    2024-04-02
  • python基础学习21----进程
    python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。 进程与线程的使用有很多相似之处,有关线程方面的知识请参考https://www.cnblogs.com/sfen...
    99+
    2023-01-30
    进程 基础 python
  • 详解Python+OpenCV进行基础的图像操作
    目录介绍形态变换腐蚀膨胀创建边框强度变换对数变换线性变换去噪彩色图像使用直方图分析图像介绍 众所周知,OpenCV是一个用于计算机视觉和图像操作的免费开源库。 OpenCV 是用 C...
    99+
    2024-04-02
  • python 多进程和多线程使用详解
    目录进程和线程 Python的多进程 进程池 多进程间的数据通信与共享 Python的多线程 多线程间的数据共享 使用queue队列通信-经典的生产者和消费者模型进程和线程 进程是...
    99+
    2024-04-02
  • Python编程入门基础语法详解
    一、基本概念内置的变量类型:Python是有变量类型的,而且会强制检查变量类型。内置的变量类型有如下几种:浮点float_number = 2.3复数complex_number = 1 + 5j整型integer_number = 1li...
    99+
    2023-06-02
  • 详解Python的多任务进程
    目录1.基本概念2.线程和进程比较3.协程和线程的比较总结1.基本概念 定义含义并发:concurrency,同一时刻只能有一条指令执行,但是多个线程的对应的指令被快速轮换地执行并行...
    99+
    2024-04-02
  • Python基础之time库详解
    一、前言 time库运行访问多种类型的时钟,这些时钟用于不同的场景。本篇,将详细讲解time库的应用知识。 二、获取各种时钟 既然time库提供了多种类型的时钟。下面我们直接来获取这些时钟,对比其具体的用途。具体代码...
    99+
    2022-06-02
    python time库 python时间处理
  • Python装饰器基础详解
    装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数...
    99+
    2022-06-04
    详解 基础 Python
  • Python基础之元类详解
    1.python 中一切皆是对象,类本身也是一个对象,当使用关键字 class 的时候,python 解释器在加载 class 的时候会创建一个对象(这里的对象指的是类而非类的实例)...
    99+
    2024-04-02
  • Python基础之模块详解
    目录一、模块1、模块的四种形式2、为什么要用模块?二、如何用模块1、import 模块名导入重命名:smt变量指向span模块的名称空间导入多个模块2、from 模块名 import...
    99+
    2024-04-02
  • Python selenium基础用法详解
    ​  活动地址:CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。 学习日记 目录 学习日记 一、Selenium库介绍 1、Selenium简介 2、Selenium的安装 3...
    99+
    2023-09-08
    python selenium
  • Python Pandas基础操作详解
    目录数据结构&Series:DataFrame的构建:索引操作:DataFrame基本操作:广播运算:索引增删改查:字符串元素处理:数据规整:总结数据结构&Serie...
    99+
    2024-04-02
  • Python基础 括号()[]{}的详解
    目录1、python中的小括号()2、python中的中括号[]3、python大括号{}花括号前言: Python主要有三种数据类型:字典、列表、元组。其分别由花括号,中括号,小括...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作