-
PythonI/O进阶学习笔记_11.python的多进程
content:
1. 为什么要多进程编程?和多线程有什么区别?
2. python 多进程编程
3. 进程间通信
=======================================
一. 为什么要多进程编程?和多线程有什么区别?
由于GIL的存在,所以对于某一些多线程任务来说,无法利用多核的优势,对这些耗cpu的任务,用多进程反而能利用多cpu。
所以多cpu的操作用多进程编程。
对io操作较多的任务来说,瓶颈不在于cpu,更多的在于io的切换中的消耗和时间等待。用多线程反而能在io挂起的时候,进行线程切换。
虽然io操作多的时候,也可以用多进程编程,但是因为进程的切换系统的代价是十分大的,所以能使用多线程的情况下,尽量用多线程。
所以,对于耗费cpu的操作,比如计算、挖矿等,多进程优于多线程。
例:同计算一组斐波拉契数列的时间比较(耗cpu的操作)
#多线程 from concurrent.futures import ThreadPoolExecutor,as_completed from concurrent.futures import ProcessPoolExecutor import time def fib(n): if n <= 2: return 1 return fib(n-1)+fib(n-2) with ThreadPoolExecutor(3) as excutor: all_task=[excutor.submit(fib,(num)) for num in range(25,35)] start_time=time.time() for future in as_completed(all_task): data=future.result() print("result:{}".format(data)) end_time=time.time() print("last time : {}".format(end_time-start_time)) #output: result:75025 result:121393 result:196418 result:317811 result:514229 result:832040 result:1346269 result:2178309 result:3524578 result:5702887 last time : 98.66604399681091
#多进程 from concurrent.futures import ThreadPoolExecutor,as_completed from concurrent.futures import ProcessPoolExecutor import time def fib(n): if n <= 2: return 1 return fib(n-1)+fib(n-2) if __name__ == "__main__": with ProcessPoolExecutor(3) as excutor: all_task = [excutor.submit(fib, (num)) for num in range(25, 35)] start_time = time.time() for future in as_completed(all_task): data = future.result() print("result:{}".format(data)) end_time = time.time() print("last time : {}".format(end_time - start_time)) #output: result:75025 result:121393 result:196418 result:317811 result:514229 result:832040 result:1346269 result:2178309 result:3524578 result:5702887 last time : 14.470988988876343
进程和线程的区别:
-
进程是资源分配的最小单位,线程是程序执行的最小单位。
-
进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
-
线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
-
但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
二、python 多进程编程
1.from concurrent.futures import ProcessPoolExecutor
ProcessPoolExecutor 和上一章 讲到的多线程的用法是一样的。包括其中用到的Futures类。
基本看它的入口函数就明白,这里不再赘述。
2.更加底层的multiprocessing
其实在ProcessPoolExecutor底层用的其实也是multiprocessing。
在multiprocess里,有个Progress类。跟Thread用法又是相似的。
#input from concurrent.futures import ProcessPoolExecutor import multiprocessing #多进程编程 import time def get_html(n): time.sleep(n) print("sub_progress sccess") if __name__
栏目列表
最新更新
Django框架的初使用
PythonI/O进阶学习笔记_11.python的多进程
Django框架(九):视图(二) HttpRequest对象、
正则表达式基本用法
C# enum
根据设备id自动打开本设备的串口
C#设计模式学习笔记:设计原则
C#实现DataTable转.CSV文件
C#实现文件Move操作和文件的Copy操作
C#调用7z实现文件的压缩与解压
基于UDP的服务器端和客户端
再谈UDP和TCP
在socket编程中使用域名
网络数据传输时的大小端问题
socket编程实现文件传输功能
如何优雅地断开TCP连接?
图解TCP四次握手断开连接
详细分析TCP数据的传输过程
图解TCP数据报结构以及三次握手(非常详
TCP协议的粘包问题(数据的无边界性)
一张图看懂 SQL 的各种 join 用法
执行count(1)、count(*) 与 count(列名) 到底有
如何去写一手好SQL ?
续 | 一套简单实用的SQL脚本,总有你需要
几道常见的SQL面试题,看你能答对几道?
你有一份经典SQL语句大全,请注意查收!
如何更优雅的写出你的SQL语句
当你执行JOIN ON时,数据库里发生了什么?
SQL 语句中 WHERE 条件后 写上1=1 是什么意思
常用SQL函数太简单?那是你没用过这些高