Python之多进程&异步并行
由于python的gil,多线程不是cpu密集型最好的选择
多进程可以完全独立的进程环境中运行程序,可以充分的利用多处理器
但是进程本身的隔离带来的数据不共享也是一个问题,而且线程比进程轻量
import multiprocessing
import datetime
def calc(i):
sum = 0
for _ in range(1000000000):
sum+=1
print(i,sum) if __name__ == '__main__':
start = datetime.datetime.now() ps = []
for i in range(5):
p = multiprocessing.Process(target=calc,args=(i,))
ps.append(p)
p.start()
for p in ps:
p.join() delta = (datetime.datetime.now()-start).total_seconds()
print(delta)
注意多进程的代码一定要在__name__='__main__'下面执行
pid 进程id
exitcode 进程退出的状态码
terminate() 终止指定的进程
进程间同步:
multiprocessing还提供了共享内存,服务器进程来共享数据,还提供了queue队列,pipe管道用于进程间通信
通讯方式不同:
1多进程就是启动多个解释器进程,进程间通信必须序列化,反序列化
2.数据的线程安全性问题
由于每个进程中没有实现多线程,gil可以说没什么用
multiprocessing.Pool是进程池类
apply(self,func,args=(),kwds={})
阻塞执行,导致主进程执行其他子进程就像一个个执行
apply_async(self,func,args=(),kwds={},callback=None,error_callback=None)
与apply方法用法一致,非阻塞执行,得到结果后执行回调
close()
关闭池,池不能在接受新的任务
terminate()
结束工作进程,不在处理未处理的任务
join()
主进程阻塞等待子进程的退出,join方法要在close或terminate之后使用
import logging
import datetime
import multiprocessing FORMAT = '%(asctime)s\t %(processName)s %(process)d %(message)s'
logging.basicConfig(level=logging.INFO,format=FORMAT) def calc(i):
sum = 0
for _ in range(1000):
sum += 1
return sum if __name__ == '__main__':
start = datetime.datetime.now()
pool = multiprocessing.Pool(5)
for i in range(5):
pool.apply_async(calc,args=(i,),callback=lambda x:logging.info('{} in callback'.format(x)))
pool.close()
# pool.join() delta = (datetime.datetime.now()-start).total_seconds()
print(delta)
请求/应答模型:web应用中常见的处理模型
master启动多个worker工作进程,一般和cpu数目相同,发挥多核优势
worker工作进程中,往往需要操作网络io和磁盘io,启动多线程,提高并发处理能力,worker处理用户请求,往往需要等待数据,处理完请求还要通过网络io返回响应
2.异步并行
'''
异步并行任务编程模块,提供一个高级的异步可执行的便利接口
ThreadPoolExecutor 异步调用的线程池的Executor
ProcessPoolExecutor 异步调用的进程池的Executor ThreadPoolExceutor对象
ThreadPoolExecutor(max_workers=1) 池中至多创建max_workers个线程来同时异步执行,返回Exceutor
submit(fn,*args,**kwargs) 提交执行的函数及其参数,返回Future实例
shutdown(wait=True) 清理池 Future类
done() 如果调用被成功的取消或者执行完成,返回True
cancelled() 如果调用被成功的取消,返回True
running() 如果正在运行而且不能被取消,返回True
cancel() 尝试取消调用,如果已经执行且不能取消返回False,否则返回True
result(timeout=None) 取返回结果,timeout为none,一直等待返回;timeout设置到期,抛出concurrent.futures.timeouterror异常。
exceptiuon(timeout=None) 取返回的异常,timeout为none,一直等待返回;timeout设置到期,抛出concurrent.futures.timeouterror异常。
'''
import threading
from concurrent import futures
import logging
import time FORMAT = '%(asctime)s\t %(processName)s %(process)d %(message)s'
logging.basicConfig(level=logging.INFO,format=FORMAT) def worker(n):
logging.info('begin to work {}'.format(n))
time.sleep(5)
logging.info('finished {}'.format(n))
#创建线程池,池的容量是3
executor = futures.ThreadPoolExecutor(max_workers=3)
fs = []
for i in range(3):
future = executor.submit(worker,i)
fs.append(future)
for i in range(3,6):
future = executor.submit(worker,i)
fs.append(future)
while True:
time.sleep(2)
logging.info(threading.enumerate())
flag = True
for f in fs: #判断是否有未完成的任务
logging.info(f.done())
flag = flag and f.done() if flag:
executor.shutdown() #清理池,池中线程全部杀掉
logging.info(threading.enumerate())
break
#线程池一旦创建线程,就不需要频繁清楚了
支持上下文:TODO
Python之多进程&异步并行的更多相关文章
- 【python】多进程锁multiprocess.Lock
[python]多进程锁multiprocess.Lock 2013-09-13 13:48 11613人阅读 评论(2) 收藏 举报 分类: Python(38) 同步的方法基本与多线程相同. ...
- Python实现多进程
Python可以实现多线程,但是因为Global Interpreter Lock (GIL),Python的多线程只能使用一个CPU内核,即一个时间只有一个线程在运行,多线程只是不同线程之间的切换, ...
- 『Python』多进程处理
尝试学习python的多进程模组,对比多线程,大概的区别在: 1.多进程的处理速度更快 2.多进程的各个子进程之间交换数据很不方便 多进程调用方式 进程基本使用multicore() 进程池优化进程的 ...
- python 使用多进程实现并发编程/使用queue进行进程间数据交换
import time import os import multiprocessing from multiprocessing import Queue, pool ""&qu ...
- Python多线程多进程
一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...
- python中多进程+协程的使用以及为什么要用它
前面讲了为什么python里推荐用多进程而不是多线程,但是多进程也有其自己的限制:相比线程更加笨重.切换耗时更长,并且在python的多进程下,进程数量不推荐超过CPU核心数(一个进程只有一个GIL, ...
- Python的多进程
这里不说其它,Python的多进程网上已经有很多了,可以尽情搜索.但是用多进程一般是采用对任务的方式,所以注意文件锁定.一般采用Pool是比较合适的.给个网友的小代码 from multiproces ...
- 进程,线程,以及Python的多进程实例
什么是进程,什么是线程? 进程与线程是包含关系,进程包含了线程. 进程是系统资源分配的最小单元,线程是系统任务执行的最小单元. 打个比方,打开word,word这个程序是一个进程,里面的拼写检查,字数 ...
- 进程与线程(2)- python实现多进程
python 实现多进程 参考链接: https://morvanzhou.github.io/tutorials/python-basic/multiprocessing/ python中实现多进程 ...
随机推荐
- ABR与ASBR区别
ABR 区域边界路由器 area border router 位于一个或多个OSPF区域边界上.将这些区域连接到主干网络的路由器.ABR被认为同时是OSPF主干和相连区域的成员.因此,它们同时维护着描 ...
- 用命令创建MySQL数据库
一.连接MYSQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1. 连接到本机上的MYSQL. 首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u roo ...
- 和TransDecoder 学习perl 自定义模块的路径问题
TransDecoder 软件是用perl 原因写的,其中包含了一些自定义的模块,通过一个脚本来进行调用,为了能够正常访问自定义的perl 模块, 在其源代码中利用了FindBin 这个模块 use ...
- Servlet、Tomcat访问(access)日志配置、记录Post请求参数
一.运行环境: Maven:3.5.2(点击下载) ,下载页 Tomcat:8.5.29(点击下载) ,下载页 JDK:jdk1.7.0_80(点击下载) ,下载页 MavenDependency: ...
- 使用DDL触发器同步多个数据库结构
使用DDL触发器同步多个数据库结构 背景:当开发组比较大时,势必会分布到不同的地理位置,若无法在同一个快速网络中工作,就会造成多个开发库并存的局面,这样就需要多个开发库结构的同步,甚至是开发测试数据的 ...
- A new session could not be created. (Original error: Requested a new session but one was in progress) (WARNING: The server did not provide any stacktrace information)
出现这个问题,是因为关毕了appium,或者是关毕了appium再次打开,那么session就不是一样的了所以报错. 一般是因为测试的时候报错了,appium自动关毕了,再次打出现的报错 解决方法:重 ...
- 【Static Program Analysis - Chapter 2】 代码的表征之抽象语法树
抽象语法树:AbstractSyntaxTrees 定义(wiki): 在计算机科学中,抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是 ...
- C#WinForm窗体内Panel容器中嵌入子窗体、程序主窗体设计例子
C#WinForm父级窗体内Panel容器中嵌入子窗体.程序主窗体设计例子 在项目开发中经常遇到父级窗体嵌入子窗体所以写了一个例子程序,顺便大概划分了下界面模块和配色,不足之处还望指点 主窗体窗体采用 ...
- [原]Jenkins(二十一) jenkins再出发Build periodically和Poll SCM
缘由: 使用jenkins的目的需要固定时间构建和间隔固定时间构建,所以才会用到这两个功能. 位置:这两个功能的位置位于每个job的config项中,如下图: [重要的注意点:] ...
- 11.1 vue(2)
2018-11-1 19:41:00 2018年倒数第二个月! 越努力越幸运!!!永远不要高估自己! python视频块看完了!还有30天吧就结束了! 今天老师讲的vue 主要是看官网文档 贴上连接 ...