进阶——python——多进程(Process 类)

简介: 进阶——python——多进程(Process 类)

Process 类

multiprocessing 模块通过创建一个 Process 对象然后调用它的 start() 方法来生成进程,Processthreading.Thread API 相同。

multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)


进程对象,表示在单独进程中运行的活动。参数说明如下:

  • group:仅用于兼容 threading.Thread,应该始终是 None。
  • target:由 run() 方法调用的可调用对象。
  • name:进程名。
  • args:目标调用的参数元组。
  • kwargs:目标调用的关键字参数字典。
  • daemon:设置进程是否为守护进程,如果是默认值 None,则该标志将从创建的进程继承。

multiprocessing.Process 对象具有如下方法和属性。

  • run():进程具体执行的方法。
  • start():启动进程。
  • join([timeout]):如果可选参数 timeout 是默认值 None,则将阻塞至调用 join() 方法的进程终止;如果 timeout 是一个正数,则最多会阻塞 timeout 秒。
  • name:进程的名称。
  • is_alive():返回进程是否还活着。
  • daemon:进程的守护标志,是一个布尔值。
  • pid:返回进程 ID。
  • exitcode:子进程的退出代码。
  • authkey:进程的身份验证密钥。
  • sentinel:系统对象的数字句柄,当进程结束时将变为 ready。
  • terminate():终止进程。
  • kill():与 terminate() 相同,但在 Unix 上使用 SIGKILL 信号。
  • close():关闭 Process 对象,释放与之关联的所有资源。

看一个使用多进程的示例。

from multiprocessing import Process
import time, os
def target():
    time.sleep(2)
    print ('子进程ID:', os.getpid())
if __name__=='__main__':
    print ('主进程ID:', os.getpid())
    ps = []
    for i in range(10):
        p = Process(target=target)
        p.start()
        ps.append(p)
    for p in ps:
        p.join()

当进程数量比较多时,我们可以利用进程池方便、高效的对进程进行使用和管理。

multiprocessing.pool.Pool([processes[, initializer[, initargs[, maxtasksperchild[, context]]]]])

进程池对象。参数说明如下:

  • processes:工作进程数目,如果 processes 为 None,则使用 os.cpu_count() 返回的值。
  • initializer:如果 initializer 不为 None,则每个工作进程将会在启动时调用 initializer(*initargs)。
  • maxtasksperchild:一个工作进程在它退出或被一个新的工作进程代替之前能完成的任务数量,为了释放未使用的资源。
  • context:用于指定启动的工作进程的上下文。

有如下两种方式向进程池提交任务:

  • apply(func[, args[, kwds]]):阻塞方式。
  • apply_async(func[, args[, kwds[, callback[, error_callback]]]]):非阻塞方式。
import multiprocessing, time
def target(p):
    print('t')
    time.sleep(2)
    print(p)
if __name__ == "__main__":
    pool = multiprocessing.Pool(processes = 5)
    for i in range(3):
        p = 'p%d'%(i)
        # 阻塞式
        pool.apply(target, (p, ))
        # 非阻塞式
        # pool.apply_async(target, (p, ))
    pool.close()
    pool.join()
相关文章
|
6天前
|
前端开发 Python
Python编程的面向对象(二)—类的多态
Python编程的面向对象(二)—类的多态
13 7
|
5天前
|
IDE Java 开发工具
Python类与面向对象
Python类与面向对象
|
9天前
|
关系型数据库 MySQL Python
mysql之python客户端封装类
mysql之python客户端封装类
|
10天前
|
负载均衡 Java 调度
探索Python的并发编程:线程与进程的比较与应用
本文旨在深入探讨Python中的并发编程,重点比较线程与进程的异同、适用场景及实现方法。通过分析GIL对线程并发的影响,以及进程间通信的成本,我们将揭示何时选择线程或进程更为合理。同时,文章将提供实用的代码示例,帮助读者更好地理解并运用这些概念,以提升多任务处理的效率和性能。
|
10天前
|
Python
python 类中的内置方法
python 类中的内置方法
|
5天前
|
数据采集 Linux 调度
Python之多线程与多进程
Python之多线程与多进程
12 0
|
8天前
|
Python
Python类中属性和方法区分3-8
Python类中属性和方法区分3-8
|
10天前
|
存储 算法 Java
关于python3的一些理解(装饰器、垃圾回收、进程线程协程、全局解释器锁等)
该文章深入探讨了Python3中的多个重要概念,包括装饰器的工作原理、垃圾回收机制、进程与线程的区别及全局解释器锁(GIL)的影响等,并提供了详细的解释与示例代码。
15 0
|
10天前
|
调度 Python
python3多进程实战(python3经典编程案例)
该文章提供了Python3中使用多进程的实战案例,展示了如何通过Python的标准库`multiprocessing`来创建和管理进程,以实现并发任务的执行。
30 0
下一篇
无影云桌面