この記事では、ソケット プログラミングの例から Python 非同期フレームワークがどのように機能するかを見ていきます。単純なソケット プログラミングと Linux が提供する I/O 再利用メカニズムを理解する必要があります。 Python 非同期フレームワーク は、基礎となるオペレーティング システムによって提供される I/O 多重化メカニズムに基づいて実装されており、たとえば、select/poll/epoll は Linux で使用できます。まず単純な 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)
に示されている例を見てみましょう。Seelctor の I/O 多重化メカニズムを使用するこの TCP エコー サーバーを実行して、出力結果を見てみましょう。
これでほぼ完了です。go で記述された tcp クライアントを引き続き実行してテストし、結果を見てみましょう。
次のチュートリアルでは、コールバック関数の代わりに Python のコルーチンを使用してこの例を変換し、async/await を使用して実行できるようにします
以上が3 つの主要な Web フロントエンド フレームワークの Python 非同期フレームワークはどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。