concurrent.futures模块(进程池&线程池)
2024-08-30 03:12:27
1、线程池的概念
由于python中的GIL导致每个进程一次只能运行一个线程,在I/O密集型的操作中可以开启多线程,但是在使用多线程处理任务时候,不是线程越多越好,因为在线程切换的时候,需要切换上下文环境,这样会导致CPU的大量开销,同时产生大量的切换时间浪费。为了解决这个问题,线程池概念被提出。预先创建好一个较为优化的数量的线程,让过来的任务立刻能够使用,就形成了线程池。python中的concurrent.futures模块为我们做了很好地封装,该模块为我们封装了线程池和进程池。
2、最佳线程数的获取:
1、通过用户慢慢递增来进行性能压测,观察QPS(即每秒的响应请求数,也即是最大吞吐能力。),响应时间
2、根据公式计算:服务器端最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间) * cpu数量
3、单用户压测,查看CPU的消耗,然后直接乘以百分比,再进行压测,一般这个值的附近应该就是最佳线程数量。
3、concurrent.futures模块中的线程池
from concurrent.futures import ThreadPoolExecutor
import time,os
def fn(name):
print('%s %s is running' %(name,os.getpid()))
time.sleep()
if __name__=="__main__":
p=ThreadPoolExecutor() #设置线程池线程数
for i in range():
obj=p.submit(fn,'线程pid:') #submit(fn, *args, **kwargs)
res=obj.result() #注意:submit提交后返回的结果是一个future对象,需要使用obj.result才能获取想要的字符串等结果
p.shutdown(wait=True) # 关闭线程池的入口,等待池内任务运行结束
4、concurrent.futures模块中的进程池
from concurrent.futures import ProcessPoolExecutor
import time,os
def fn(name):
print('%s %s is running' %(name,os.getpid()))
time.sleep()
if __name__=="__main__":
p=ProcessPoolExecutor() #设置进程池线程数
for i in range():
obj=p.submit(fn,'进程pid:') #submit(fn, *args, **kwargs)
res=obj.result() #注意:submit提交后返回的结果是一个future对象,需要使用obj.result才能获取想要的字符串等结果
p.shutdown(wait=True) # 关闭进程池的入口,等待池内任务运行结束
5、多线程的+回调函数执行
from concurrent.futures import ThreadPoolExecutor
import requests def fetch_async(url):
response = requests.get(url)
return response #返回执行结果对象 def callback(future):
print(future.result()) #future 相当于将上面函数执行结果对象response传递进去执行.result()方法 url_list = ['http://www.github.com', 'http://www.bing.com']
pool = ThreadPoolExecutor(5)
for url in url_list:
v = pool.submit(fetch_async, url)
v.add_done_callback(callback) #执行对象的回调函数
pool.shutdown(wait=True)
最新文章
- [tem]Longest Increasing Subsequence(LIS)
- 关于php留言本网站的搭建
- 在SQL2008R2查询分析器出错(在执行批处理时出现错误。错误消息为: 目录名称无效。)
- Period(poj 1961)
- Windows下GNU之gcc体验方法
- angularJs ionic phoneGap 分享
- 实现了在android实现左右滑动切换界面的效果
- CMStepCounter Class Refernce
- js便利关联数组 及数组定义方式 分类
- Linux-进程描述(2)之进程标识符进程位置与环境变量
- [BZOJ1002] [FJOI2007] 轮状病毒 (数学)
- PHP SOAP 发送XML
- 查询rman 备份信息集
- python-爬虫-selenium模块
- 2018.10.27 codeforces402D. Upgrading Array(数论+贪心)
- 本地服务器搭建服务:svn
- 【读书笔记】iOS-网络-Cookie
- 解决PC有道云笔记卸载重装后无法数据同步问题
- AndroidStudio 编译异常java.lang.OutOfMemoryError: GC overhead limit exceeded
- charles的破解方法
热门文章
- 科学效法自然:微软研究人员测试AI控制的滑翔机
- Codeforces Round #Pi (Div. 2) 567E 	President and Roads ( dfs and similar, graphs, hashing, shortest paths )
- JavaScript BOM DOM 对象
- 第二单元OO总结
- linux虚拟机配置网络
- 01_3_查询指定id的单个对象
- stringByAppendingString和stringByAppendingPathComponent
- message() 信息提示
- 【启发式拆分】bzoj4059: [Cerc2012]Non-boring sequences
- 【哈希 二分】bzoj2084: [Poi2010]Antisymmetry