python3.x 多路IO复用补充asyncio
asyncio模块是python之父写的模块,按说应该是靠谱的,python3.6版本定义为稳定版本。
说明书:https://docs.python.org/3/library/asyncio.html?highlight=asyncio#module-asyncio
大概定义:该模块提供了使用协程编写单线程并发代码,通过套接字和其他资源复用I / O访问,运行网络客户端和服务器以及其他相关原语的基础结构。
简单应用(基于wsgi的报警器)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/8/21 10:40
# @Author : WangYue
# @Site :
# @File : alertor_uwsgi.py
# @Software: PyCharm #加入环境变量避免程序报错
import sys,os
sys.path.append(os.path.dirname(os.path.dirname(__file__))) #引入wsgi模型,这里主要是弄一个简单的http模型来说明asyncio的简单使用
from wsgiref.simple_server import make_server #引入asyncio
import asyncio #引入其他可能的依赖
from threading import Thread
import json #引入本程序其他的内容,与asyncio无关是程序业务的其他部分
from conf.alertor_conf import ALERTOR_CONFIG
from model.alert_method_class import SendMail #定义一个运行asyncio loop 的线程,去单独运行它
def start_loop(loop):
asyncio.set_event_loop(loop)
loop.run_forever()
new_loop = asyncio.new_event_loop() #这个new_loop将会用于运行异步程序
t = Thread(target=start_loop, args=(new_loop,))
t.start() #利用多线程,额外起一个线程运行asyncio loop然后它在自身使用协程之类处异步处理业务 #这是wsgi主业务程序,application是wsgi的入口程序,wsgi就规定了这么个函数名,这样写wsgi就认可它是入口了。传参也是wsgi的规定,第一个是环境,第二个是响应
def application(env,start_res):
res_headers=[('Content-type', 'text/plain')]
if env["REQUEST_METHOD"]=='POST':
# the environment variable CONTENT_LENGTH may be empty or missing
try:
if env['PATH_INFO'] != "/send_alert":
status = "404 func is not in use"
start_res(status, res_headers)
return [b"func is not in use"] request_body_size = int(env.get('CONTENT_LENGTH', 0))
status = "200 OK"
request_body = env['wsgi.input'].read(request_body_size)
print("post_info -->", request_body.decode())
r_body=json.loads(request_body.decode())
#就这里一行代码,new_loop.call_soon_threadsafe(),告诉asyncio去运行第一个参数的函数名,后边的参数是被运行函数的传参,有多少就传参多少个,这是异步的,非阻塞的。
new_loop.call_soon_threadsafe(SendMail.sendEmail,"Alertor Alarm level:"+r_body["level"]+" server: "+r_body["server"],r_body)
start_res(status,res_headers)
return [b"ok send alert......."]
except (ValueError):
status = "404 json data not found key"
request_body_size = 0
start_res(status, res_headers)
return [b"get post info faild"] else:
status = "403 method error"
start_res(status,res_headers)
return [b'method error'] # 1、只接受POST请求。数据为json格式,json中标记的,包括但不限于,包括的信息将会入库,其他信息,在告警时会一并发出
# {
# "level":"high", #告警级别,"high","medium","info",这个可以在配置文件中配置,配置信息是个列表,有序的从左至右为["high","medium","info"],对应后续告警逻辑及post中json的本字段。
# "@timestamp":"",#告警时间
# "server":"",#告警源,可以是ip,主机名,服务名等可标识的
# "message":""#具体的告警信息
# }
# 2、根据json中的level自动选择告警途径,选择方式,在配置文件中的alert_method字典信息
# 3、将告警内容,存储数据库,便于日后查询
# 4、后续提供查询统计告警信息的方法 if __name__=="__main__":
wsgi_server=make_server(ALERTOR_CONFIG['bind_ip'],ALERTOR_CONFIG['port'],application) wsgi_server.serve_forever()
目前这里先这么用,这个模型的性能是基于uwsgi运行,2进程,每个进程内4个线程,基准性能是15000请求总量,5000客户端
ab -n 15000-c 5000 -p test_alert.txt -T application/x-www-form-urlencoded "http://test.alert.com.cn/test.html"
效果还凑合吧。
python3.x 多路IO复用补充asyncio的更多相关文章
- Redis03——Redis之单线程+多路IO复用技术
Redis 是单线程+多路IO复用技术 多路复用:使用一个线程来检查多个文件描述符的就绪状态 如果有一个文件描述符就绪,则返回 否则阻塞直到超时 得到就绪状态后进行真正的操作可以在同一个线程里执行,也 ...
- 多路IO复用模型--select, poll, epoll
select 1.select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数 2.解决1024以下客户端时使用se ...
- Linux企业级项目实践之网络爬虫(27)——多路IO复用
与多线程和多进程相比,I/O多路复用的最大优势是系统开销小,系统不需要建立新的进程或者线程,也不必维护这些线程和进程. 主要应用: (1)客户程序需要同时处理交互式的输入和服务器之间的网络连接 (2) ...
- 协程与多路io复用epool关系
linux上其实底层都基于libevent.so模块实现的,所以本质一样 gevent更关注于io和其它 epool只是遇到io就切换,而gevent其它等待也切换
- 基于select类型多路IO复用,实现简单socket并发
还有很多缺限,如客户断开无限重复 以下转至老师博客: server: #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = " ...
- Reactor模式,或者叫反应器模式 - 为什么用多路io复用提供吞吐量
Reactor这个词译成汉语还真没有什么合适的,很多地方叫反应器模式,但更多好像就直接叫reactor模式了,其实我觉着叫应答者模式更好理解一些.通过了解,这个模式更像一个侍卫,一直在等待你的召唤,或 ...
- 20190925-03Redis端口号的由来及单线程加多路IO复用 000 024
- 应用层协议实现系列(一)——HTTPserver之仿nginx多进程和多路IO的实现
近期在尝试自己写一个Httpserver,在粗略研究了nginx的代码之后,决定仿照nginx中的部分设计自己实现一个高并发的HTTPserver,在这里分享给大家. 眼下使用的较多的Httpserv ...
- IO复用,AIO,BIO,NIO,同步,异步,阻塞和非阻塞 区别参考
参考https://www.cnblogs.com/aspirant/p/6877350.html?utm_source=itdadao&utm_medium=referral IO复用,AI ...
随机推荐
- SLAM学习资料整理(转)
原文出处:http://www.cnblogs.com/wenhust/p/5942893.html 书籍: 1.必读经典 Thrun S, Burgard W, Fox D. <Probabi ...
- JQuery | trigger() 方法
trigger() 方法触发被选元素的指定事件类型. 语法格式: trigger(type,[data]) type:触发事件类型 [data]:可选项,表示在触发事件时传递给函数的附加参数. 实例: ...
- 应用日志获取-web系统
1 场景 应用使开发写的,但应用使部署再服务器上,而开发没有ssh登陆服务器的权限. so,开发总是请运维查日志,下载日志. so and so,运维要花很多时间帮开发去搞日志. 这是件很没意义的事, ...
- Machine Learning Codeforces - 940F(带修莫队) && 洛谷P4074 [WC2013]糖果公园
以下内容未验证,有错请指正... 设块大小为T,则块数为$\frac{n}{T}$ 将询问分为$(\frac{n}{T})^2$块(按照左端点所在块和右端点所在块分块),同块内按时间从小到大依次处理 ...
- Elasticsearch之探索集群信息
REST API 启动并运行了节点和集群,下一步是了解如何与它进行通信.elasticsearch提供了一个非常全面和强大的REST API,可以使用它与集群进行交付. 使用API完成以下: • 检查 ...
- 083 Remove Duplicates from Sorted List 有序链表中删除重复的结点
给定一个排序链表,删除所有重复的元素使得每个元素只留下一个.案例:给定 1->1->2,返回 1->2给定 1->1->2->3->3,返回 1->2- ...
- 105 Construct Binary Tree from Preorder and Inorder Traversal 从前序与中序遍历序列构造二叉树
给定一棵树的前序遍历与中序遍历,依据此构造二叉树.注意:你可以假设树中没有重复的元素.例如,给出前序遍历 = [3,9,20,15,7]中序遍历 = [9,3,15,20,7]返回如下的二叉树: ...
- [已读]编写高质量代码--Web前端开发修炼之道
我觉得还蛮实用的一本,推荐看看,主要涉及到这些: 标签语义化.css模块化. css的一些东西,比如haslayout 文档流,还有如何实现水平.垂直居中. js代码组织与js分层.js压缩 编码规范 ...
- 142. O(1)时间检测2的幂次
用 O(1) 时间检测整数 n 是否是 2 的幂次. 您在真实的面试中是否遇到过这个题? Yes 样例 n=4,返回 true; n=5,返回 false. class Solution { publ ...
- MD5加密的方法
#region MD5加密 /// <summary> /// MD5加密 /// </summary> /// <param name="strPwd&quo ...