进程

 由于GIL的存在,Python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在Python中大部分情况需要使用多进程。Python提供了非常好用的多进程模块multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个模块,可以轻松完成从单进程到并发执行的转换。multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了ProcessLockQueuePipe等组件。

  multiprocessing模块是Python中的多进程模块。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(),run(), join()的方法。此外multiprocessing模块中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading模块中的同名类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换到了多进程的情境。 当然多进程的定义方式也和多线程类似,即两种方式:

目标函数实例化定义新的进程:

# 导入多进程模块
from multiprocessing import Process# os.getpid() 获取当前进程的id
import osdef run_proc(name):print('{} child process is {}'.format(name, os.getpid()))if __name__ == '__main__':print("Parent process is {}".format(os.getpid()))p = Process(target=run_proc, args=('test', ))print('child process will start...')p.start()p.join()print('child process end.')
复制代码

运行截图如下:

继承类来定义新的进程

from multiprocessing import Process
import osclass RunProc(Process):def __init__(self, name):Process.__init__(self)self.name = namedef run(self):print('{} child process is {}'.format(self.name, os.getpid()))if __name__ == "__main__":print("Parent process is {}".format(os.getpid()))p = RunProc('test')print('child process will start...')p.start()p.join()print('child process end.')
复制代码

运行结果如下:

我们可以看见,多进程的使用方式和多线程几乎一样,比如以下: Process([group [, target [, name [, args [, kwargs]]]]])

  • group: 线程组,目前还没有实现,库引用中提示必须是None;
  • target: 要执行的方法;
  • name: 进程名;
  • args/kwargs: 要传入方法的参数。

实例方法:

  • is_alive():返回进程是否在运行。
  • join([timeout]):阻塞当前上下文环境的进程程,直到调用此方法的进程终止或到达指定的timeout(可选参数)。
  • start():进程准备就绪,等待CPU调度
  • run():strat()调用run方法,如果实例进程时未制定传入targetstart执行默认的· run()方法。
  • terminate():不管任务是否完成,立即停止工作进程

属性:

  • daemon:和线程的setDeamon功能一样
  • exitcode(进程在运行时为None、如果为–N,表示被信号N结束)
  • name:进程名字。
  • pid:进程号。

进程的独立性:

和线程不一样的是,进程之间相互独立,我们可以从全局变量的修改窥见一些:

from multiprocessing import Process# 测试数据
ex_list = 'Hello World'# 修改数据进程
def revise_data():global ex_list# 修改全局变量ex_list = ex_list + ' with write revise_data process.'print('wirte result:', ex_list)# 查看数据进程
def view_data():print(ex_list)if __name__ == "__main__":process_revise = Process(target=revise_data)process_view = Process(target=view_data)process_revise.start()# 主进程等待写入进程执行完成以后代码 再继续往下执行process_revise.join()process_view.start()process_view.join()print("process end.")
复制代码

运行截图如下:

我们定义了两个进程,分别用来修改全局变量和查看修改后的数据,我们看见虽然修改的进程已经成功修改了变量,但是在查看进程中全局变量仍然是原来的值,即进程之间是不共享全局变量的,即创建子进程其实是对主进程进行拷贝,进程之间相互独立,访问的全局变量不是同一个,所以进程之间不共享全局变量。

转载于:https://juejin.im/post/5cb318fcf265da0368144dc3

Python并行编程(七):多进程的基本使用和与多线程的差异相关推荐

  1. Python 并行编程教程 | Lynda教程 中文字幕

    Python 并行编程教程 | Lynda教程 中文字幕 Python Parallel Programming Solutions 课程ID: 604237 时长: 4.0小时 所属类别:Pytho ...

  2. python多线程和多进程——python并行编程实验

    工作中经常涉及到加速程序的运行,除了代码逻辑的优化,算法的优化之外,还经常使用的一招就是并发编程.至于python的并型编程这一块.说到并行编程,我们不得不谈线程和进程这两个概念: 进程:对于操作系统 ...

  3. python中的多线程求值串行和并行_python多线程和多进程——python并行编程实验

    工作中经常涉及到加速程序的运行,除了代码逻辑的优化,算法的优化之外,还经常使用的一招就是并发编程.至于python的并型编程这一块.说到并行编程,我们不得不谈线程和进程这两个概念: + 进程:对于操作 ...

  4. python多线程并行编程,Python并行编程(二):基于线程的并行

    1.介绍 软件应用中使用最广泛的并行编程范例是多线程.通常一个应用有一个进程,分成多个独立的线程,并行运行.互相配合,执行不同类型的任务. 线程是独立的处理流程,可以和系统的其他线程并行或并发地执行. ...

  5. Python 并行编程

    参考:python-parallel-programming-cookbook-cn:https://python-parallel-programmning-cookbook.readthedocs ...

  6. python并发编程之多进程理论部分

    阅读目录 一 什么是进程 二 进程与程序的区别 三 并发与并行 四 同步\异步and阻塞\非阻塞(重点) 五 进程的创建(了解) 六 进程的终止(了解) 七 进程的层次结构 八 进程的状态 九 进程并 ...

  7. Python并发编程之多进程(一)

    一.什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 进程是资源分配的基本单位 进程有:代码段,数据段,进程控制块(PCB)组成 二.进程与程序的区别 程序仅仅只是一堆代 ...

  8. python并发编程之多进程理论知识

    一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): egon在一个时间段内有很多任务要做:python备课的任务,写书的任 ...

  9. Python并发编程之多进程(二)

    十.进程同步 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理 ---------- ...

最新文章

  1. NLPML_总结_20210208
  2. linux防火墙伦堂,「linux专栏」自从看了这篇文章,我彻底搞懂了selinux和防火墙...
  3. C#操作Access数据库中遇到的问题(待续)
  4. spoj Help the Military Recruitment Office!
  5. c#跨线程操作控件(有UI操作)|及多线程操作
  6. Filter(过滤器) 和 interceptor(拦截器)的区别
  7. shell脚本 变量
  8. terminal登录mysql_转载-MySQL之终端(Terminal)管理MySQL
  9. SpringBoot中静态资源和首页定制
  10. AutoMapper学习笔记
  11. 华为eNSP三层架构网络配置
  12. 解决——》Mysql导出excel时,数值型变成科学计数法
  13. 一个完整的产品设计都要哪些设计流程
  14. 2022-02-05大数据学习日志——Hadoop离线阶段——Hive SQL DDL
  15. Bad Request This combination of host and port requires TLS
  16. 揪出那些在Windows操作系统中注册的WFP函数
  17. linux为用户指定资源大小,Linux_Linux系统下生成一个指定大小的文件,在装系统,因此在这里随便记 - phpStudy...
  18. 如何取SQL结果集的第一条记录
  19. Modified Polygon (Allow modified: No), (Allow shelved: No)/修改的多边形(允许修改:否)(允许搁置:否)
  20. 在线文档协作进行项目管理

热门文章

  1. python设置环境变量_Python设置环境变量
  2. pytorch macos_Windows,Linux和MacOS上的PyTorch安装
  3. ROS的学习(十二)用C++写一个简单的发布者
  4. ROS的学习(六)理解ROS的节点(NODE)
  5. 一个有助于理解事件冒泡和事件捕获的例子
  6. 不同级别的Java开发人员的应聘要求
  7. 开课吧:深入了解C++语言应用方向有哪些?
  8. golang的定时任务
  9. 我买了个阿里云服务器并在上面部署了一个项目
  10. 秒杀系统设计中的业务性思考