Python并发编程之二:multiprocessing 模块

本文介绍了Python的multiprocessing模块,详细讲解了GIL的概念及其对多线程的影响,以及multiprocessing模块如何实现多进程。主要内容包括Process类的介绍,如进程关系、参数、方法和属性,强调了在Windows中使用Process()的注意事项。此外,文章还讨论了进程间的空间隔离、join方法的使用,以及守护进程的概念和限制。
摘要由CSDN通过智能技术生成

一、multiprocessing 模块介绍

1、GIL

1、GIL 即全局解释器所(global interpreter lock),每个线程在执行时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说多线程并不是真正意义上的同时执行。

2、CPython 解释器执行 Python 程序 过程:

  1. 设置GIL

  2. 切换到一个线程去运行

  3. 运行,直至完成指定的字节码指令,或者线程主动让出控制

  4. 将该线程设置为睡眠状态

  5. 解锁GIL

  6. 重复以上所有步骤,运行下一个线程

3、Python 程序在 CPython 解释器运行过程图:
在这里插入图片描述

结论:

1、由于 GIL 的存在,python程序在 CPython 解释器中运行的多线程无法利用多核优势。
2、GIL 并不是 Python 的特性,它是在实现 Python 解析器(CPython)时所引入的一个概念。但是由于 CPython 是大部分环境下默认的 Python 执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把 GIL 归结为 Python 语言的缺陷。

2、关于 multiprocessing 模块

1、Python提供的multiprocessing 模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。

2、multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。

二、Process 类的介绍

Process类是一个创建进程的类, 借助这个类, 就可以完成进程的创建。

1、进程关系

1、获取当前程序的进程和父进程

import os

def func():
    print(os.getpid(), os.getppid())

func() # 3060 10232

结论:每次执行程序只有当前程序的进程pid(getpid())会改变,父进程的pid不会改变,原因是父进程是pycharm编辑器:
在这里插入图片描述
2、在主程序中的进程关系

from multiprocessing import Process
import os

def func():
    print(os.getpid(), os.getppid())

if __name__ == '__main__':
    print('main:', os.getpid(), os.getppid())
    p = Process(target=func)
    p.start()

# main: 14392 10232
# 11088 14392

结论 :无论程序运行多少次,主程序都是 func() 的父进程,而且主程序是pycharm的子进程。

2、参数

  • group:预留参数,值始终
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值