ホームページ >バックエンド開発 >Python チュートリアル >3 つの主要な Web フロントエンド フレームワークの Python 非同期フレームワークはどのように機能しますか?

3 つの主要な Web フロントエンド フレームワークの Python 非同期フレームワークはどのように機能しますか?

Tomorin
Tomorinオリジナル
2018-08-16 10:06:464056ブラウズ

この記事では、ソケット プログラミングの例から 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(&#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)

に示されている例を見てみましょう。Seelctor の I/O 多重化メカニズムを使用するこの TCP エコー サーバーを実行して、出力結果を見てみましょう。

これでほぼ完了です。go で記述された tcp クライアントを引き続き実行してテストし、結果を見てみましょう。

次のチュートリアルでは、コールバック関数の代わりに Python のコルーチンを使用してこの例を変換し、async/await を使用して実行できるようにします


以上が3 つの主要な Web フロントエンド フレームワークの Python 非同期フレームワークはどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。