广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python的进程及进程池是什么
  • 927
分享到

Python的进程及进程池是什么

2023-06-21 20:06:18 927人浏览 独家记忆

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

摘要

这篇文章主要介绍了python的进程及进程池是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。进程进程是操作系统分配资源的基本单元,是程序隔离的边界。进程和程序程序只是一组

这篇文章主要介绍了python的进程及进程池是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

进程

进程是操作系统分配资源的基本单元,是程序隔离的边界。

进程和程序

程序只是一组指令的集合,它本身没有任何运行的含义,它是静态的。

进程程序的执行实例,是动态的,有自己的生命周期,有创建有撤销,存在是暂时的。

进程和程序不是一一对应的,一个程序可以对应多个进程,一个进程也可以执行一个或者多个程序。

我们可以这样理解:编写完的代码,没有运行时称为程序,正在运行的代码,会启动一个(或多个)进程。

Python的进程及进程池是什么

进程的状态

在我们的操作系统⼯作时,任务数往往⼤于cpu核心数,即⼀定有⼀些任务正在执⾏,⽽另外⼀些任务在等待cpu,因此导致了进程有不同的状态。

Python的进程及进程池是什么

  • 就绪状态:已满⾜运⾏条件,等待cpu执⾏

  • 执⾏状态:cpu正在执⾏

  • 等待状态:等待某些条件满⾜,比如⼀个程序sleep了,此时就处于等待状态

Python中的进程

在Python中,进程是通过multiprocessing多进程模块来创建的,multiprocessing模块提供了⼀个Process类来创建进程对象。

创建⼦进程

Process语法结构:

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

  • group:指定进程组,⼤多数情况下⽤不到

  • target:表示调用对象,即子进程要执行的任务

  • name:子进程的名称,可以不设定

  • args:给target指定的函数传递的参数,以元组的⽅式传递

  • kwargs:给target指定的函数传递命名参数

Process常用方法

  • p.start() 启动进程,并调用该子进程中的p.run()方法

  • p.join(timeout):主进程等待⼦进程执⾏结束再结束,timeout是可选的超时时间

  • is_alive():判断进程⼦进程是否还存活

  • p.run() 进程启动时运行的方法,正是它去调用target指定的函数

  • p.terminate() ⽴即终⽌⼦进程

Process创建的实例对象的常⽤属性

name:当前进程的别名,默认为Process-N,N为从1开始递增的整数

pid:当前进程的pid(进程号)

import multiprocessingimport osimport timedef work(name):    print("子进程work正在运行......")    time.sleep(0.5)    print(name)    # 获取进程的名称    print("子进程name", multiprocessing.current_process())    # 获取进程的pid    print("子进程pid", multiprocessing.current_process().pid, os.getpid())    # 获取父进程的pid    print("父进程pid", os.getppid())    print("子进程运行结束......")if __name__ == '__main__':    print("主进程启动")    # 获取进程的名称    print("主进程name", multiprocessing.current_process())    # 获取进程的pid    print("主进程pid", multiprocessing.current_process().pid, os.getpid())    # 创建进程    p = multiprocessing.Process(group=None, target=work, args=("tigeriaf", ))    # 启动进程    p.start()    print("主进程结束")

Python的进程及进程池是什么

通过上述代码我们发现,multiprocessing.Process帮我们创建一个子进程,并且成功运行,但是我们发现,在子进程还没执行完的时候主进程就已经死了,那么这个子进程在主进程结束后就是一个孤儿进程,那么我们可以让主进程等待子进程结束后再结束吗?答案是可以的。 那就是通过p.join(),join()的作用是让主进程等子进程执行完再退出。

import multiprocessingimport osimport timedef work(name):    print("子进程work正在运行......")    time.sleep(0.5)    print(name)    # 获取进程的名称    print("子进程name", multiprocessing.current_process())    # 获取进程的pid    print("子进程pid", multiprocessing.current_process().pid, os.getpid())    # 获取父进程的pid    print("父进程pid", os.getppid())    print("子进程运行结束......")if __name__ == '__main__':    print("主进程启动")    # 获取进程的名称    print("主进程name", multiprocessing.current_process())    # 获取进程的pid    print("主进程pid", multiprocessing.current_process().pid, os.getpid())    # 创建进程    p = multiprocessing.Process(group=None, target=work, args=("tigeriaf", ))    # 启动进程    p.start()    p.join()    print("主进程结束")

运行结果:

Python的进程及进程池是什么

可以看出,主进程是在子进程结束后才结束的。

全局变量问题

全局变量在多个进程中不共享,进程之间的数据是独立的,默认情况下互不影响。

import multiprocessing# 定义全局变量num = 99def work1():    print("work1正在运行......")    global num   # 在函数内部声明使⽤全局变量num    num = num + 1  # 对num值进⾏+1    print("work1 num = {}".fORMat(num))def work2():    print("work2正在运行......")    print("work2 num = {}".format(num))if __name__ == '__main__':    # 创建进程p1    p1 = multiprocessing.Process(group=None, target=work1)    # 启动进程p1    p1.start()    # 创建进程p2    p2 = multiprocessing.Process(group=None, target=work2)    # 启动进程p2    p2.start()

运行结果:

Python的进程及进程池是什么

从运⾏结果可以看出,work1()函数对全局变量num的修改,在work2中并没有获取到,⽽还是原来的99,所以,进程之间是不够共享变量的。

守护进程

上面说到,可以使用p.join()让主进程等待子进程结束后再结束,那么可不可以让子进程在主进程结束的时候就结束呢?答案是肯定的。 我们可以使用p.daemon = True或者p2.terminate()进行设置:

import multiprocessingimport timedef work1():    print("work1正在运行......")    time.sleep(4)    print("work1运行完毕")def work2():    print("work2正在运行......")    time.sleep(10)    print("work2运行完毕")if __name__ == '__main__':    # 创建进程p1    p1 = multiprocessing.Process(group=None, target=work1)    # 启动进程p1    p1.start()    # 创建进程p2    p2 = multiprocessing.Process(group=None, target=work2)    # 设置p2守护主进程    # 第⼀种⽅式    # p2.daemon = True  在start()之前设置,不然会抛异常    # 启动进程p2    p2.start()    time.sleep(2)    print("主进程运行完毕!")    # 第⼆种⽅式     p2.terminate()

执行结果如下:

Python的进程及进程池是什么

由于p2设置了守护主进程,所以主进程运行完毕后,p2子进程也随之结束,work2任务停止,而work1继续运行至结束。

进程池

当需要创建的⼦进程数量不多时, 可以直接利⽤multiprocessing.Process动态生成多个进程, 但如果要创建很多进程时,⼿动创建的话⼯作量会非常大,此时就可以⽤到multiprocessing模块提供的Pool去创建一个进程池。

multiprocessing.Pool常⽤函数:

  • apply_async(func, args, kwds):使⽤⾮阻塞⽅式调⽤func(任务并⾏执⾏),args为传递给func的参数列表,kwds为传递给func的关键字参数列表

  • apply(func, args, kwds):使⽤阻塞⽅式调⽤func,必须等待上⼀个进程执行完任务后才能执⾏下⼀个进程,了解即可,几乎不用

  • close():关闭Pool,使其不再接受新的任务

  • terminate():不管任务是否完成,⽴即终⽌

  • join():主进程阻塞,等待⼦进程的退出,必须在close或terminate之后使⽤

初始化Pool时,可以指定⼀个最⼤进程数,当有新的任务提交到Pool中时,如果进程池还没有满,那么就会创建⼀个新的进程⽤来执⾏该任务,但如果进程池已满(池中的进程数已经达到指定的最⼤值),那么该任务就会等待,直到池中有进程结束才会创建新的进程来执⾏。

from multiprocessing import Poolimport timedef work(i):    print("work'{}'执行中......".format(i), multiprocessing.current_process().name, multiprocessing.current_process().pid)    time.sleep(2)    print("work'{}'执行完毕......".format(i))if __name__ == '__main__':    # 创建进程池    # Pool(3) 表示创建容量为3个进程的进程池    pool = Pool(3)    for i in range(10):        # 利⽤进程池同步执⾏work任务,进程池中的进程会等待上⼀个进程执行完任务后才能执⾏下⼀个进程        # pool.apply(work, (i, ))        # 使⽤异步⽅式执⾏work任务        pool.apply_async(work, (i, ))    # 进程池关闭之后不再接受新的请求    pool.close()    # 等待po中所有子进程结束,必须放在close()后面, 如果使⽤异步⽅式执⾏work任务,主线程不再等待⼦线程执⾏完毕再退出!    pool.join()

执行结果为:

Python的进程及进程池是什么

从结果我们可以看出,只有3个子进程在执行任务,此处我们使用的是异步⽅式(pool.apply_async(work, (i, )))执⾏work任务,如果是以同步方式(pool.apply(work, (i, )))执行,进程池中的进程会等待上⼀个进程执行完任务后才能执⾏下⼀个进程。

感谢你能够认真阅读完这篇文章,希望小编分享的“Python的进程及进程池是什么”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网Python频道,更多相关知识等着你来学习!

--结束END--

本文标题: Python的进程及进程池是什么

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

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

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Python的进程及进程池是什么
    这篇文章主要介绍了Python的进程及进程池是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。进程进程是操作系统分配资源的基本单元,是程序隔离的边界。进程和程序程序只是一组...
    99+
    2023-06-21
  • Python的进程及进程池详解
    目录进程进程和程序进程的状态Python中的进程创建⼦进程全局变量问题守护进程进程池总结进程 进程是操作系统分配资源的基本单元,是程序隔离的边界。 进程和程序 程序只是一组指令的集合...
    99+
    2022-11-12
  • Python进程池基本概念是什么
    这篇文章主要介绍“Python进程池基本概念是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python进程池基本概念是什么”文章能帮助大家解决问题。前言:创建进程池可以形象地理解为创建一个并行...
    99+
    2023-06-29
  • Python自带的线程池和进程池有什么用
    这篇文章主要介绍“Python自带的线程池和进程池有什么用”,在日常操作中,相信很多人在Python自带的线程池和进程池有什么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2022-10-19
  • Python进程锁和进程池
    进程锁进程与进程之间是独立的,为何需要锁?对于进程,屏幕的输出只有一个,此时就涉及到资源的竞争。在Linux的Python2.x中可能出现问题。这仅仅是一种情况,多个进程之间虽然是独立的,但仅限于内存和运算,如果涉及到其它一些资源,就可能存...
    99+
    2023-01-31
    进程 Python
  • Python并发编程之线程池/进程池
    原文来自开源中国前言python标准库提供线程和多处理模块来编写相应的多线程/多进程代码,但当项目达到一定规模时,频繁地创建/销毁进程或线程是非常消耗资源的,此时我们必须编写自己的线程池/进程池来交换时间空间。但是从Python3.2开始,...
    99+
    2023-06-02
  • Python进程池怎么实现的
    Python进程池可以通过使用`multiprocessing`模块中的`Pool`类来实现。 下面是一个简单的示例,展示了如何使用...
    99+
    2023-10-25
    Python
  • python中ThreadPoolExecutor线程池和ProcessPoolExecutor进程池
    目录1、ThreadPoolExecutor多线程<1>为什么需要线程池呢<2>标准库concurrent.futures模块<3>简单使用<...
    99+
    2022-11-11
  • Python中的进程池和线程池的适用场景和实现原理是什么?
    Python中的进程池和线程池的适用场景和实现原理是什么?引言:在编写程序时,为了提高执行效率,经常会使用并发编程来同时执行多个任务。Python提供了进程池和线程池这两种用于并发处理任务的工具。本文将详细介绍进程池和线程池的适用场景和实现...
    99+
    2023-10-22
    线程池 实现原理 进程池 适用场景
  • Python进程池与进程锁实例分析
    本篇内容主要讲解“Python进程池与进程锁实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python进程池与进程锁实例分析”吧!进程池什么是进程池上一章节关于进程的问题我们提到过,进程...
    99+
    2023-06-29
  • python中ThreadPoolExecutor线程池和ProcessPoolExecutor进程池怎么使用
    这篇文章主要介绍了python中ThreadPoolExecutor线程池和ProcessPoolExecutor进程池怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python中ThreadPoolE...
    99+
    2023-07-02
  • python进程池的简单实现
    目录创建进程池向进程池提交任务并行执行多个任务关闭进程池等待任务执行完毕Python进程池是Python标准库中multiprocessing模块提供的一种用于管理进程的方式。它可以...
    99+
    2023-03-13
    python进程池
  • python进程监控及管理的方法是什么
    在Python中,可以使用以下方法来监控和管理进程:1. 使用`subprocess`模块创建和管理子进程。`subprocess`...
    99+
    2023-10-12
    python
  • Python进程池基本概念
    目录一、python进程池二、进程池如何使用?申请()apply_async地图()map_async()close()终端()加入()三、代码实列四、进程池中的进程和一般的进程有什...
    99+
    2022-11-13
  • python进程池如何实现
    这篇文章主要介绍了python进程池如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python进程池如何实现文章都会有所收获,下面我们一起来看看吧。Python进程池是Python标准库中multipr...
    99+
    2023-07-05
  • 怎么在python中使用进程池
    这篇文章给大家介绍怎么在python中使用进程池,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用开发;5、游...
    99+
    2023-06-14
  • Python 多进程并发操作中进程池Pool的实例
    在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成...
    99+
    2022-06-04
    进程 实例 操作
  • Python进程池与进程锁常用的方法有哪些
    这篇文章主要介绍“Python进程池与进程锁常用的方法有哪些”,在日常操作中,相信很多人在Python进程池与进程锁常用的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python进程池与进程锁常用...
    99+
    2023-06-30
  • Python 多线程及进程
    threading使用 (工业风案例) import threading from time import sleep, ctime loop = [4, 2] class ThreadFunc: def __init_...
    99+
    2023-01-30
    多线程 进程 Python
  • Python进程和线程的概念是什么
    这篇文章主要介绍“Python进程和线程的概念是什么”,在日常操作中,相信很多人在Python进程和线程的概念是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python进程和线程的概念是什么”的疑惑有所...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作