>백엔드 개발 >파이썬 튜토리얼 >세 가지 주요 웹 프런트엔드 프레임워크 중 Python 비동기 프레임워크는 어떻게 작동하나요?

세 가지 주요 웹 프런트엔드 프레임워크 중 Python 비동기 프레임워크는 어떻게 작동하나요?

Tomorin
Tomorin원래의
2018-08-16 10:06:464018검색

이 기사에서는 소켓 프로그래밍의 예를 통해 Python 비동기 프레임워크가 어떻게 작동하는지 살펴보겠습니다. 우리는 Linux에서 제공하는 간단한 소켓 프로그래밍과 I/O 재사용 메커니즘을 이해해야 합니다. Python 비동기 프레임워크도 기본 운영 체제에서 제공하는 I/O 다중화 메커니즘을 기반으로 구현됩니다. 예를 들어 Linux에서는 select/poll/epoll을 사용할 수 있습니다. 먼저 간단한 Python 소켓 서버 예제를 살펴보겠습니다. Python 코드는 Python3을 사용하며 선택기 모듈을 사용할 수 있는지 확인합니다.

예제

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 클라이언트로 테스트해 보겠습니다.

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를 사용하여 변환합니다. 이 모듈은 Linux의 epoll과 같은 기본 운영 체제에서 제공하는 I/O 다중화 메커니즘을 캡슐화합니다. I/O 다중화 메커니즘을 통해 여러 파일 설명자의 읽기 및 쓰기 이벤트를 모니터링하고 콜백 함수를 등록하여 더 나은 동시성 성능을 달성할 수 있습니다. 먼저 python3

import selectors
import socket
sel = selectors.DefaultSelector()
def accept(sock, mask):
    conn, addr = sock.accept()  # Should be ready
    print(&#39;accepted&#39;, conn, &#39;from&#39;, 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(&#39;echoing&#39;, repr(data), &#39;to&#39;, conn)
        conn.send(data)  # Hope it won&#39;t block
    else:
        print(&#39;closing&#39;, conn)
        sel.unregister(conn)
        conn.close()
sock = socket.socket()
sock.bind((&#39;localhost&#39;, 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)

의 선택기 문서에 제공된 예제를 살펴보겠습니다. seeelctors I/O 다중화 메커니즘을 사용하는 이 tcp 에코 서버를 실행하고 출력 결과를 살펴보겠습니다.

이제 거의 다 되었습니다. 작성된 TCP 클라이언트를 계속 실행하여 테스트하고 결과를 확인해 보겠습니다.

나중 튜토리얼에서는 콜백 함수 대신 Python의 코루틴을 사용하여 이 예제를 변환하므로 async/await를 사용하여 실행할 수 있습니다


위 내용은 세 가지 주요 웹 프런트엔드 프레임워크 중 Python 비동기 프레임워크는 어떻게 작동하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.