Python并行编程(七):多进程的基本使用和与多线程的差异
进程
由于GIL
的存在,Python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU
的资源,在Python中大部分情况需要使用多进程。Python提供了非常好用的多进程模块multiprocessing
,只需要定义一个函数,Python会完成其他所有事情。借助这个模块,可以轻松完成从单进程到并发执行的转换。multiprocessing
支持子进程、通信和共享数据、执行不同形式的同步,提供了Process
、Lock
、Queue
、Pipe
等组件。
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方法,如果实例进程时未制定传入
target
,start
执行默认的·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并行编程(七):多进程的基本使用和与多线程的差异相关推荐
- Python 并行编程教程 | Lynda教程 中文字幕
Python 并行编程教程 | Lynda教程 中文字幕 Python Parallel Programming Solutions 课程ID: 604237 时长: 4.0小时 所属类别:Pytho ...
- python多线程和多进程——python并行编程实验
工作中经常涉及到加速程序的运行,除了代码逻辑的优化,算法的优化之外,还经常使用的一招就是并发编程.至于python的并型编程这一块.说到并行编程,我们不得不谈线程和进程这两个概念: 进程:对于操作系统 ...
- python中的多线程求值串行和并行_python多线程和多进程——python并行编程实验
工作中经常涉及到加速程序的运行,除了代码逻辑的优化,算法的优化之外,还经常使用的一招就是并发编程.至于python的并型编程这一块.说到并行编程,我们不得不谈线程和进程这两个概念: + 进程:对于操作 ...
- python多线程并行编程,Python并行编程(二):基于线程的并行
1.介绍 软件应用中使用最广泛的并行编程范例是多线程.通常一个应用有一个进程,分成多个独立的线程,并行运行.互相配合,执行不同类型的任务. 线程是独立的处理流程,可以和系统的其他线程并行或并发地执行. ...
- Python 并行编程
参考:python-parallel-programming-cookbook-cn:https://python-parallel-programmning-cookbook.readthedocs ...
- python并发编程之多进程理论部分
阅读目录 一 什么是进程 二 进程与程序的区别 三 并发与并行 四 同步\异步and阻塞\非阻塞(重点) 五 进程的创建(了解) 六 进程的终止(了解) 七 进程的层次结构 八 进程的状态 九 进程并 ...
- Python并发编程之多进程(一)
一.什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 进程是资源分配的基本单位 进程有:代码段,数据段,进程控制块(PCB)组成 二.进程与程序的区别 程序仅仅只是一堆代 ...
- python并发编程之多进程理论知识
一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): egon在一个时间段内有很多任务要做:python备课的任务,写书的任 ...
- Python并发编程之多进程(二)
十.进程同步 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理 ---------- ...
最新文章
- NLPML_总结_20210208
- linux防火墙伦堂,「linux专栏」自从看了这篇文章,我彻底搞懂了selinux和防火墙...
- C#操作Access数据库中遇到的问题(待续)
- spoj 	Help the Military Recruitment Office!
- c#跨线程操作控件(有UI操作)|及多线程操作
- Filter(过滤器) 和 interceptor(拦截器)的区别
- shell脚本 变量
- terminal登录mysql_转载-MySQL之终端(Terminal)管理MySQL
- SpringBoot中静态资源和首页定制
- AutoMapper学习笔记
- 华为eNSP三层架构网络配置
- 解决——》Mysql导出excel时,数值型变成科学计数法
- 一个完整的产品设计都要哪些设计流程
- 2022-02-05大数据学习日志——Hadoop离线阶段——Hive SQL DDL
- Bad Request This combination of host and port requires TLS
- 揪出那些在Windows操作系统中注册的WFP函数
- linux为用户指定资源大小,Linux_Linux系统下生成一个指定大小的文件,在装系统,因此在这里随便记 - phpStudy...
- 如何取SQL结果集的第一条记录
- Modified Polygon (Allow modified: No), (Allow shelved: No)/修改的多边形(允许修改:否)(允许搁置:否)
- 在线文档协作进行项目管理