这篇文章我们从 socket 编程的例子来看看 Python 异步框架是如何工作的,需要了解下简单的 socket 编程以及 Linux 提供的 I/O 复用机制。 Python 异步框架也是基于操作系统底层提供的 I/O 复用机制来实现的,比如 linux 下可以使用 select/poll/epoll 等。 我们先看个简单的 python socket server 例子,Python 代码使用 Python3,确保可以使用 selectors 模块。

一个实例import socket

HOST = 'localhost' # The remote host

PORT = 8888 # Arbitrary non-privileged port

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

s.bind((HOST, PORT))

s.listen(50)

while True:

conn, addr = s.accept()

print('Connected by', addr)

with conn:

while 1:

data = conn.recv(1024)

if not data:

break

conn.sendall(data)

我们下边用一个 golang 的 tcp client 测试下它:package main

import (

"fmt"

"net"

"os"

"sync"

)

func sendMessage(msg string) error {

conn, err := net.Dial("tcp", "localhost:8888")

if err != nil {

return fmt.Errorf("error: %v", err)

}

defer conn.Close()

_, err = conn.Write([]byte("hello"))

if err != nil {

return fmt.Errorf("error: %v", err)

}

reply := make([]byte, 1024)

_, err = conn.Read(reply)

if err != nil {

println("Write to server failed:", err.Error())

os.Exit(1)

}

println("reply from server=", string(reply))

return nil

}

func main() {

var wg sync.WaitGroup

nbGoroutines := 20

wg.Add(nbGoroutines)

for k := 0; k < nbGoroutines; k++ {

go func() {

err := sendMessage("hello")

if err != nil {

fmt.Printf("fail: %v\n", err)

}

wg.Done()

}()

}

wg.Wait()

}

使用 go 运行它可以看到输出。

接下来我们使用 python3 提供的 selectros 来改造它,这个模块封装了操作系统底层提供的 I/O 复用机制,比如 linux 上使用了 epoll。通过 I/O 复用机制我们可以监听多个文件描述符的可读写事件并且注册回调函数,拥有更好的并发性能。 先看 python3 的 selectors 文档给的例子import selectors

import socket

sel = selectors.DefaultSelector()

def accept(sock, mask):

conn, addr = sock.accept() # Should be ready

print('accepted', conn, 'from', addr)

conn.setblocking(False)

sel.register(conn, selectors.EVENT_READ, read)

def read(conn, mask):

data = conn.recv(1000) # Should be ready

if data:

print('echoing', repr(data), 'to', conn)

conn.send(data) # Hope it won't block

else:

print('closing', conn)

sel.unregister(conn)

conn.close()

sock = socket.socket()

sock.bind(('localhost', 1234))

sock.listen(100)

sock.setblocking(False)

sel.register(sock, selectors.EVENT_READ, accept)

while True: # 这其实就是通常在异步框架中所说的 event loop 啦

events = sel.select()

for key, mask in events:

callback = key.data

callback(key.fileobj, mask)

我们来运行下这个 使用了 seelctors I/O 复用机制的 tcp echo server 看下输出结果。

到这里就差不多了,我们再继续运行 go 写的 tcp client 来测试它看结果。

在后边教程中我们将使用 python 的 coroutine 而不是回调函数来改造这个例子,这样一来我们就能使用 async/await 来运行它了

以上就是web前端三大主流框架之Python异步框架如何工作?的详细内容,更多请关注php中文网其它相关文章!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

python的前端框架_web前端三大主流框架之Python异步框架如何工作?相关推荐

  1. python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用

    python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用 redispy安装 安装及简单使用:https://github.com/andymccurdy/ ...

  2. web前端三大主流框架_web前端三大主流框架

    于前端开发工程师来说,组件化模块的框架能够帮助我们更加快速的搭建自己的网站.下面本篇文章和大家介绍一下web前端的三大主流框架:Angular.React.Vue,让大家可以对这三个框架有一定的了解, ...

  3. java目前主流框架_java的三大主流框架介绍

    <java的三大主流框架介绍>由会员分享,可在线阅读,更多相关<java的三大主流框架介绍(2页珍藏版)>请在装配图网上搜索. 1.java的三大主流框架介绍java的三大主流 ...

  4. python闭包的原理_web前端:js 闭包原理

    闭包包含自由(未绑定到特定对象)变量;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)."闭包"一词来源于以下两者的结合:要执行的代码 ...

  5. angular语言前端开发_web前端开发入门全套学习方法路径,兼职在家做网站也能月入上万...

    前端学习路径 1.WEB前端快速入门 在本阶段,我们需要掌握 HTML 与 CSS 基础,当然,也包含 H5 和 C3 的新特性.这个部分内容非常简单,而且非常容易掌握.相信你也更愿意学习这个部分,毕 ...

  6. java怎么将图片文件转流并在jsp前端显示_web前端—面试题汇总(001-005)

    每天坚持更新五道web前端开发面试题:点点关注,才会不迷路哦~~~~~ 001.WEB应用中如果有.class和.jar类型的文件一般分别应该放在什么位置? 答:.class文件放在WEB-INF/c ...

  7. mui实现手机web前端拍照_Web前端中的常见技术名称及所实现的功能

    今天小编要跟大家分享的文章是关于Web前端中的常见技术名称及所实现的功能.熟悉Web前端工作的小伙伴都知道Web中有很多的技术,想要成为一名合格的Web前端工程师你必须要一项一项的掌握技术,如Html ...

  8. 百度云盘云知梦php_[云知梦]WEB前端开发_WEB前端新手入门视频教程[百度云盘]

    有想系统学习前端技术的小伙伴们,福利来啦! 课程介绍 本路线图汇集云知梦大牛专家老师最新原创课程,路线图内容涵盖Html/CSS.Javascript.jQuery. Node.js.Express ...

  9. 后端直接跳转前端页面_WEB前端开发中页面跳转等待时间过长如何解决?

    作为一个初学前端的小白,我遇到了这个令我疑惑的问题. 项目使用webpack打包并且用webpack-dev-server测试. 在我完成登录功能后发现浏览器在工作中有"偷懒"的嫌 ...

最新文章

  1. cmd运行java文件_Java基础 前传
  2. 美团2020年全年财务报告:疫情期间网络营销之下的美团选择进军社区团购
  3. python中reduce是什么意思,python中的map和reduce有什么不同
  4. 友盟开放日: 通过 App 内社区提高留存率的 6 个技巧
  5. 浅析SAX,DOM,JAXP,JDOM与DOM4J之间的关系
  6. scala 字符串转换数组_如何在Scala中将字节数组转换为字符串?
  7. linux下解压 编译 安装,Linux 下开发环境安装配置-编译、解压、超链、
  8. Array.prototype.slice Array.prototype.splice 用法阐述
  9. 编写计算机取余程序_必须收藏,2020年专升本计算机常考知识点总结,抓分的关键点...
  10. 开源免费CRM云端的客户管理系统SuiteCRM简介(视频)
  11. 数字电路基础知识——锁存器与触发器在Verilog中使用问题
  12. 少儿计算机编程都学什么,少儿编程课是学什么的?
  13. 三菱q系列plc连接电脑步骤_SERVER和三菱Q系列PLC通讯设置步骤
  14. 2022.0831学习Java 笔记之Java常用类库(二)
  15. unison实现文件双向同步
  16. 如何在生产环境mysql删除亿万级数据解并且不影响数据库主从延迟的解决方案
  17. 六十甲子亡命安葬山向宜忌
  18. 软件测试学习之路-----文本编辑器和计算机基本命令笔记
  19. Testin云测试以AI自动化技术打造业内领先的兼容测试服务平台
  20. 他一年开发19款!款款口碑爆棚

热门文章

  1. Java千百问_03基本的语法(005)_二进制是如何做位运算的
  2. Spring第八发—自动装配及让Spring自动扫描和管理Bean
  3. Android 拖动条(SeekBar)实例 附完整demo项目代码
  4. MFC 字符串截取成数组 wcstok
  5. hive sql插入一行数据_Hive查询某一重复字段记录第一条数据
  6. pc构件生产线及设备_【图片】PC装配式建筑生产线,PC构件装备,PC生产线模台15805376300【pc装配式建筑吧】...
  7. build 之前执行task_一次NPM前端项目的CI-Build速度优化
  8. c语言中0xde 这怎么用,为什么使用0x61c88647
  9. 抓取百度页面html,百度会抓取页面代码中的注释内容吗
  10. php的cookie教程,PHP4之COOKIE支持详解