• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

python 搞代码 4年前 (2022-01-09) 11次浏览 已收录 0个评论

这篇文章我们从 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(&quot<div>本文来源gaodai.ma#com搞#代!码网_</div>;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异步框架如何工作?的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:web前端三大主流框架之Python异步框架如何工作?

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址