服务使用了 python3.7,sanic 框架,使用临时文件的大概代码如下:

​import os
import sys
import logging
import traceback
import sanic
import asyncio
import matplotlib.pyplot as pltapp = sanic.Sanic('My color patch service', load_env='MY_COLORPATCH_')def _worker(request):data = request.pop('data')longitudes = [r[0] for r in data]latitudes = [r[1] for r in data]values = [r[2] for r in data]fig = plt.figure(figsize=(10, 10), dpi=90)'''draw image by matplotlib'''image_file = os.path.realpath('out1.png')fig.savefig(image_file, transparent=True)plt.close(fig)return image_filedef _worker_wrap(request):try:return _worker(request)except KeyboardInterrupt as e:raise e  # rethrow the Ctrl+C Exception, for terminate the worker processexcept:return traceback.format_exc(limit=5)@app.route('/gen_color_patches', {'POST'})
async def make_color_patch(request):loop = asyncio.get_event_loop()resp = await loop.run_in_executor(None, _worker_wrap, request.json)if os.path.exists(resp):return await sanic.response.file_stream(resp, mime_type='image/png')return sanic.response.json({'code': 1, 'msg': resp}, status=500)if __name__ == '__main__':logging.basicConfig(level=logging.INFO, format='%(asctime)s-%(levelname)s: %(message)s')address_bind = sys.argv[1] if len(sys.argv) > 1 else 'localhost'port = sys.argv[2] if len(sys.argv) > 2 else '8000'app.run(host=address_bind, port=int(port), workers=1)

因为生成临时文件需要IO时间,所以想省去写和读文件开销,所以改写如下:

def _worker(request):'''以上都未变'''image_file = io.BytesIO()fig.savefig(image_file, transparent=True)plt.close(fig)return image_fileasync def make_color_patch(request):loop = asyncio.get_event_loop()resp = await loop.run_in_executor(None, _worker_wrap, request.json)if isinstance(resp, str):return sanic.response.json({'code': 1, 'msg': resp}, status=500)return sanic.response.raw(resp.getbuffer(), content_type='image/png')

临时的测试脚本也一并改写,移去了下载文件后写临时文件再读文件的步骤:

import os
import io
import json
import requests
import matplotlib.pyplot as pltdata_file = r'D:\projects\预报数据.json'
with open(data_file, 'r', encoding='utf-8') as f:data = json.load(f)params = {'adcode': '450000','width': 1080,'height': 1000,'data': [(float(d['longitude']), float(d['latitude']), float(d['tmp'])) for d in data],
}
resp = requests.post('http://127.0.0.1:8000/gen_color_patches', json=params)
from PIL import Image
img = Image.open(io.BytesIO(resp.content))
plt.imshow(img)
plt.show()

BytesIO 作为一个 file-like object 实现,用起来确实很方便

python 使用 io.BytesIO 内存文件加速图片生成服务相关推荐

  1. python图片保存为txt文件_python实现对文件中图片生成带标签的txt文件方法

    在深度学习中经常需要生成带标签的图片名称列表,xxxlist.txt文件,下面写一个简单的python脚本生成该文件列表. import os def generate(dir,label): fil ...

  2. Python爬虫之scrapy下载文件和图片

    Python爬虫之scrapy下载文件和图片 一:pipeline 二:使用scrapy下载图片 2.1 创建scrapy项目 1.2 创建爬虫 1.3 配置文件设置 1.4 编写启动文件 1.5 爬 ...

  3. Python基础-IO编程-读文件read-写文件write

    IO 编程初识 IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动.Input Stream就是数据从外面(磁盘.网络)流进内存,Outpu ...

  4. Python实例 -- 如何将.npy文件转换为图片

    为了节省空间,有时会将.jpg文件转换为.npy文件,这样便于存储,然后需要图片的时候,再将其转为.jpg文件,这个过程是如何实现的呢?为了演示这个案例,我们分为2步. 第1步:将.jpg文件保存为. ...

  5. Java以IO流和文件流,生成、下载二维码

    场景 在系统中生成一个二维码,用户保存下来并分享出去,其他人扫描之后跳到我们的一个活动详情页,查看此活动的内容. 从以上的需求中,可以提炼出以下几点: 当用户点击生成二维码的时候,我们要拿到用户生成的 ...

  6. 10 个优秀的占位图片生成服务

    placehold.it A quick and simple image placeholder service. 特点:老牌服务,支持 HTTPS 可定制:尺寸.颜色.文字.格式 http://p ...

  7. python读取txt文件写入-python 读取、写入txt文件的示例

    写入文件 使用open()函数和write()函数 但是有两种写法,分别是'a'和'w' 'a' 表示写入文件 若无该文件会直接创建一个 如果存在这个文件,会接着已有的内容的后面写入 with ope ...

  8. python中io.textio_Python文件读写概述(IO操作、文件读写、stringiobytesio、序列化),python,的,小,总结,StringIOBytesIO...

    IO操作 在进行文件的读写之前,需要说明几点.首先,运行的程序和读取的数据都会在内存中缓存. 进入到 程序或数据 内存 其次,用python程序进行文件的读写,需要创建一个小工具–文件流,用来处理数据 ...

  9. python截图直接在内存里调用_Python-按块上传FTP中的内存文件(由API调用生...

    我需要能够在Python中通过FTP和SFTP上传文件,但有一些不常见的约束. >绝对不能将文件写入磁盘. >通过调用API并将JSON响应写入文件来生成文件. >有多个对API的调 ...

最新文章

  1. datagridview控件读写mysql数据库表格的方法_C#读写Access数据库、表格datagridview窗体显示代码实例...
  2. 收藏:通信网络基础知识
  3. [转]Tomcat启动错误的几件事
  4. 注意力机制的两种形式
  5. boost::fibers::launch::dispatch的测试程序
  6. sdram 时钟相位_stm32f429主频大于160MHz时,sdram数据不稳定
  7. 分布式设计与开发(四)------数据拆分
  8. eggjs增删改查MySQL_egg-sequelize 实现 增删改查
  9. atitit.jndi的架构与原理以及资源配置and单元测试实践
  10. java eclipse 下载_JAVA下载安装及eclipse下载安装
  11. 龙果学院从无到有构建亿级微服务秒杀系统
  12. C语言数字图像处理---1.3 图像直方图
  13. python爬取百思不得姐视频代码
  14. 1000年出现了哪些闰年C语言,C语言判断“1000年―2000年”之间的闰年
  15. LaTex---在图片或表格上方、下方添加字体
  16. 生物信息学仿真软件SInC的初步使用教程
  17. 如何将文件打包到jar包里面
  18. 3D数学——法线变换
  19. 间充质干细胞最新研究成果进展(2021年10月)
  20. NoSQL简介及MongoDB的常用命令

热门文章

  1. 做抖音自媒体能赚钱吗?
  2. 从零开始搭建网站 01:IP、域名、域名解析服务器(DNS)、DNSSEC
  3. 玩转Linux的下Ip计算器(图文)
  4. JUC下的CountDownLatch,CyclicBarrier、Semaphore的使用方法
  5. 2020中北大学计算机调剂名额,2020年中北大学考研调剂信息
  6. mes项目 组态开发项目reademe文档 待整理
  7. iPhone14pro紫色“掉漆”/ 苹果英伟达拒绝台积电涨价/ DALL·E取消排队...今日更多新鲜事在此...
  8. 【Tool】常用 GIT 命令参阅
  9. 菜鸟起步2-逆向分析学习
  10. ARM64(M1版)Mac运行MAA以及AzurLaneAutoScript自动化打明日方舟和碧蓝航线