需求:在调用阿里云 函数式计算 时,由于 其函数式计算系统 在分配系统资源时,可能存在 多个任务分配给同一个 服务器(每个服务器2核3G内存),导致 多个相同任务在多线程调用函数式计算时 总有几个 因为资源分配不均返回较慢(包括带宽问题);并且 在多线程 调用函数式计算时,每个线程的函数相同,并且根据业务需求,只要把返回结果list 拼接一下并且满足指定长度即可;

解决方法:使用多线程的 先返回的任务先处理的方法,比如 多线程请求20个函数式计算任务,但是只需要先返回的10个任务即可,剩下的10个任务 忽略;这样能保证 最大程度最大概率的 前10个任务返回总体时间很短,从而 优化接口执行时间;

图示:

技术名: python+ThreadPoolExecutor+as_completed

主要技术点:as_completed

实例代码:

from concurrent.futures import ThreadPoolExecutor, as_completed
import timedef get_ali_fun(times):time.sleep(times)return timesexecutor = ThreadPoolExecutor()
urls = [3, 2, 4]
all_task = [executor.submit(get_ali_fun, url) for url in urls]result_list = []
for future in as_completed(all_task):data = future.result()result_list.append(data)print("获取数据,耗时 {}s".format(data))if len(result_list) == 2:print("先返回的数据已经满足条件 则 剩下的1个线程结果 不再处理。。。")breakprint("继续处理下面程序")

as_completed()方法是一个生成器,在没有任务完成的时候,会阻塞,在有某个任务完成的时候,会yield这个任务,就能执行for循环下面的语句,然后继续阻塞住,循环到所有的任务结束。从结果也可以看出,先完成的任务会先通知主线程

关于阿里云函数式计算相关 知识备注:

1.在调用其服务时,如果需要分析 耗时,需要 考虑 服务内部函数执行时间 和 来回网络带宽时间;

2.截止2020.3.15 问的其技术人员 其 函数计算 在不调用15分钟后 释放资源(以后可能会缩短),如果对时间敏感,可以通过airflow等 使用定时任务方式调用函数计算,不让其释放资源(冷启动至少10s耗费);不要使用 阿里云内置的 预留资源(太贵了。。。)

3.函数式计算系统 在分配资源时 是根据内存进行分配,每个服务器2核3G内存,如果函数 分配内存1G,则有一定 概率 3个函数都在一个服务器上,这样 如果对于并发时间敏感的任务,则有一定的概率 耗时增加;最极端优化方式:一个函数分配3G内存,则保证一个任务1个服务器;缺点是 太费钱。。。

4.如果对时间敏感,需要 考虑 增加带宽(减少带宽导致时间过长的概率,然而时间操作 仍有很大概率),或者 配置 云服务器 和 函数式计算同一个VPC(让其在同一个内网中)

5.如果一个借口 调用多个 函数 进行函数式计算,如果没有 函数间的 依赖,可以考虑 进程+协程 等让其同时 运行 从而节约时间

6.函数式计算的 时间优化 计算优化到尽头 如果 还是需要考虑 资金问题,那仍有 很大概率 无法达到100% 预期时间;因为 函数式计算系统的 资源分配 是随机的,可能 相同函数的 多个任务 都在一个服务器上,这样就比 在不同服务器上 耗时增加;所以 随缘吧。。。

as_completed参数 过期时间 设置,注意 如果不添加过期时间,并且函数如果没有返回值,则此线程一直存在,可能造成内存逐渐增加的情况

# -*- coding: utf-8 -*-
"""
(C) Guangcai Ren <rgc@bvrft.com>
All rights reserved
create time '2020/3/30 18:59'Module usage:"""
from concurrent.futures._base import as_completed, TimeoutError
from concurrent.futures.thread import ThreadPoolExecutordef sleep_fun(_time):"""耗时操作:param _time::return:"""import timetime.sleep(_time)return _timepool = ThreadPoolExecutor()
pool_result = [pool.submit(sleep_fun, func_param) for func_param in [1, 1000]]try:# as_completed添加超时时间,如果不添加,则此 线程池一直存在;for result in as_completed(pool_result, 2):print(result.result())print('do other thing!')
except TimeoutError as e:# 清除相关资源,参数 默认为True,需要 所有线程都返回数据才清空资源;参数为 False,则直接清空资源,继续执行后续程序pool.shutdown(False)print('shut down!')
print('do something!!!')

相关链接:

https://www.jianshu.com/p/b9b3d66aa0be

Python多线程实现 as_completed先返回的任务先处理 在 阿里云 函数式计算 优化的应用相关推荐

  1. 基于阿里云函数计算实现需要用到超大依赖包的 Python 无服务器计算

    文章目录 引言 一.阿里云函数计算是什么? 开发流程 函数计算的触发调用 函数计算运行实例的生命周期 二.示例应用的架构及简介 三.具体开发部署步骤所遇到的坑和~~避坑指南~~ 坑1. 超大依赖包的部 ...

  2. Python Flask web 项目零改动迁移至阿里云函数计算

    引言 最近尝试了一下阿里云的函数计算,整体感觉很好,主要是省钱!下面就简单聊一下,如何将 Python Flask 的 web 项目迁移至函数计算. 创建一个银行卡校验的 RestAPI 文件名:in ...

  3. python 多线程 线程如何获得返回值 (重写threading.Thread类)

    重写threading.Thread类: # -*- coding: utf-8 -*- """ @File : dontla_ThreadClass.py @Time ...

  4. 爆肝一周,用Python在物联网设备上写了个智能语音助手-阿里云智能语音交互

    基于HaaS云端一体框架,用Python打造HaaS EDU K1智能语音助手的过程中需要用到云端能力.本篇文章介绍如何开通阿里云智能语音交互,并创建配置语音识别及语音合成项目,获取Appkey.请参 ...

  5. python提取word文件中的图片,并上传阿里云OSS,返回html图片标签

    该需求是一个真实的实战需求,如果你的公司在做题库类的系统,一定会涉及该方面的内容,所以收藏起来吧. 需求简单描述如下所示: 提取 Word(为了便于解决,统一格式为 docx)中的题干/选项图片: 将 ...

  6. python 做网站 知乎_python做网站 知乎的搜索结果-阿里云开发者社区

    伤不起的全栈程序员 前段时间听说一个新名词:"全栈程序员",google了一下,被引导到了知乎的一个讨论上: http://www.zhihu.com/question/22420 ...

  7. python函数几个return语句_Python常用函数--return 语句-阿里云开发者社区

    在Python教程中return 语句是函数中常用的一个语句. return 语句用于从函数中返回,也就是中断函数.我们也可以选择在中断函数时从函数中返回一个值. 案例(保存为 function_re ...

  8. python 线程池 map_python 线程池 map_python ThreadPoolExecutor线程池使用-阿里云开发者社区...

    python有好几种实现线程池的方式, 注意选择一下,哪种是自己需要的. 最近用上ThreadPoolExecutor, 用来代替celery的方式. 主要是用在celery上的时间太少, 没有吃透, ...

  9. Python基础入门:(一)从变量到异常处理 --阿里云天池

    目录在最上面 一.学习内容概括: 二.值得注意内容: 1. 三元运算符 2. is.is not 运算符 3. print() 函数 4. 利用位运算实现快速计算 5. 利用位运算实现整数集合 6. ...

  10. python 多态app_多态简介 | Python从入门到精通:高阶篇之三十三-阿里云开发者社区...

    多态 多态是面向对象的三大特征之一. 多态从字面上理解是多种形态.例如:狗有多个种类(狼狗.藏獒.哈士奇.古代牧羊犬...). 一个对象可以以不同的形态去呈现. 我们先来定义两个类: class A: ...

最新文章

  1. 实战SSM_O2O商铺_46【Redis缓存】头条信息+商铺目录Service层加入缓存
  2. hdu 4059 The Boss on Mars 容斥
  3. 淘宝联盟 推广链接 API取链 转链报错 传入参数错误,请检查adzone_id是否属于appkey拥有者
  4. python基础(1)——简介与安装
  5. bzoj:2331: [SCOI2011]地板
  6. Matlab2017a汉化版软件详细安装教程
  7. 学习-Java类和对象之对象组合之求圆柱体积
  8. gpt分区android系统备份,OBR一键还原备份系统WINPE专用v2.166版支持GPT分区UEFI
  9. python 实现Web版股票行情界面
  10. 看《西游记》谈团队管理
  11. mysql分组之后再求和
  12. Unity3D GUI Skin
  13. Unity 使用UGUI制作连连看小游戏
  14. 架构师之路系列:接口幂等性是个什么东东?如何实现接口幂等设计?
  15. 1_Lexical Pitfalls 词汇陷阱
  16. 面试必备!TCP协议经典十五连问!
  17. 交叉线、直通线背后掩藏着什么?
  18. 外贸个人结汇金额超过5W上限怎么办,办理义乌个体户提升结汇上限!
  19. 【web网页设计期末课程大作业】基于HTML+CSS+JavaScript仿山东传媒职业学院网站
  20. 实现财务自由 之 A 股上市公司股票同行业的排名情况(例如贵州茅台所属行业总市值排名)简单查看方法

热门文章

  1. MAME打开ROM报错解决办法
  2. 修改idea64.exe.vmoptions导致双击打不开idea的解决办法
  3. 魔兽世界插件开发:Beginning Lua with World of Warcraft Add-ons 中文翻译及学习 (1.1)
  4. 面试问到UDP,这样回答offer拿到手软
  5. cousera视频无法加载
  6. 使用FFMPEG3.4.2版本进行视频的解码为YUV格式
  7. APISpace 行驶证OCR API
  8. Java 进口管制限制解除
  9. Masimo宣布旨在协助COVID-19响应努力的远程患者处治解决方案Masimo SafetyNet™全面上市
  10. [白话解析] 深入浅出支持向量机(SVM)之核函数