您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息

web前端三大主流框架之Python异步框架如何工作?

2024/4/26 9:41:10发布5次查看
这篇文章我们从 socket 编程的例子来看看 python 异步框架是如何工作的,需要了解下简单的 socket 编程以及 linux 提供的 i/o 复用机制。 python 异步框架也是基于操作系统底层提供的 i/o 复用机制来实现的,比如 linux 下可以使用 select/poll/epoll 等。 我们先看个简单的 python socket server 例子,python 代码使用 python3,确保可以使用 selectors 模块。
一个实例
import sockethost = 'localhost' # the remote hostport = 8888 # arbitrary non-privileged portwith 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 mainimport ( "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 selectorsimport socketsel = 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异步框架如何工作?的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录