이 기사에서는 소켓 프로그래밍의 예를 통해 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('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)
의 선택기 문서에 제공된 예제를 살펴보겠습니다. seeelctors I/O 다중화 메커니즘을 사용하는 이 tcp 에코 서버를 실행하고 출력 결과를 살펴보겠습니다.
이제 거의 다 되었습니다. 작성된 TCP 클라이언트를 계속 실행하여 테스트하고 결과를 확인해 보겠습니다.
나중 튜토리얼에서는 콜백 함수 대신 Python의 코루틴을 사용하여 이 예제를 변환하므로 async/await를 사용하여 실행할 수 있습니다
위 내용은 세 가지 주요 웹 프런트엔드 프레임워크 중 Python 비동기 프레임워크는 어떻게 작동하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!