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)

最新文章

  1. [tem]Longest Increasing Subsequence(LIS)
  2. 关于php留言本网站的搭建
  3. 在SQL2008R2查询分析器出错(在执行批处理时出现错误。错误消息为: 目录名称无效。)
  4. Period(poj 1961)
  5. Windows下GNU之gcc体验方法
  6. angularJs ionic phoneGap 分享
  7. 实现了在android实现左右滑动切换界面的效果
  8. CMStepCounter Class Refernce
  9. js便利关联数组 及数组定义方式 分类
  10. Linux-进程描述(2)之进程标识符进程位置与环境变量
  11. [BZOJ1002] [FJOI2007] 轮状病毒 (数学)
  12. PHP SOAP 发送XML
  13. 查询rman 备份信息集
  14. python-爬虫-selenium模块
  15. 2018.10.27 codeforces402D. Upgrading Array(数论+贪心)
  16. 本地服务器搭建服务:svn
  17. 【读书笔记】iOS-网络-Cookie
  18. 解决PC有道云笔记卸载重装后无法数据同步问题
  19. AndroidStudio 编译异常java.lang.OutOfMemoryError: GC overhead limit exceeded
  20. charles的破解方法

热门文章

  1. 科学效法自然:微软研究人员测试AI控制的滑翔机
  2. Codeforces Round #Pi (Div. 2) 567E President and Roads ( dfs and similar, graphs, hashing, shortest paths )
  3. JavaScript BOM DOM 对象
  4. 第二单元OO总结
  5. linux虚拟机配置网络
  6. 01_3_查询指定id的单个对象
  7. stringByAppendingString和stringByAppendingPathComponent
  8. message() 信息提示
  9. 【启发式拆分】bzoj4059: [Cerc2012]Non-boring sequences
  10. 【哈希 二分】bzoj2084: [Poi2010]Antisymmetry