Python3 で WebSocket サービスを実装するにはどうすればよいですか?

Pythonwebsocketサービスの実装は非常に簡単です。利用可能なサードパーティ パッケージが多数あります。インターネット上でよく使用される 3 つのパッケージを見つけました: websocketwebsocketsFlask-Sockets

websocketしかし、これらのパッケージの多くは、2016 年時点では2010メンテナンスされていないなど、「荒廃」しています。

ここに画像の説明を挿入します

そしてメンテナンスFlask-Sockets2016年内に終了しました。

ここに画像の説明を挿入します

また、サードパーティのパッケージを使用する場合は、そのパッケージがまだメンテナンスされているかどうかを必ず確認してください。作成者がメンテナンスを停止している場合は、そのパッケージを再度使用しないでください。メンテナンスにはそれほど時間がかかりません。あなたがそれを食べるのは大きな損失です。

ウェブソケット

メンテナンスされなくなった 2 つのパッケージを除くと、残るのは 1 つだけですwebsocketsが、このパッケージは私たちのニーズを満たしますか?

まず最初にwebsockets覗いてみたところ、コミュニティは最近もメンテナンス中であることがわかりました。また、websockets完全なソースコードと使い方のチュートリアルもあり、初心者にとって非常に親切です。
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

ソースコードとチュートリアルのアドレス:
https://pypi.org/project/websockets/
https://github.com/python-websockets/websockets
https://websockets.readthedocs.io/en/stable/intro/tutorial1.html

例:

サービス.py

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import asyncio
import websockets


async def hello(websocket):
    recv_data = await websocket.recv()
    print('<<< %s' % recv_data)

    send_data = 'Hello %s' % recv_data
    await websocket.send(send_data)
    print('>>> %s' % send_data)


async def start():
    print('Server started ...')
    async with websockets.serve(hello, '0.0.0.0', 8765):
        await asyncio.Future()


if __name__ == '__main__':
    asyncio.run(start())

client.py

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import asyncio
import websockets


async def hello():
    uri = 'ws://0.0.0.0:8765'
    async with websockets.connect(uri) as websocket:

        send_data = input("What's your name: ")

        await websocket.send(send_data)
        print('>>> %s' % send_data)

        recv_data = await websocket.recv()
        print('<<< %s' % recv_data)


if __name__ == '__main__':
    asyncio.run(hello())

これは単純なWebSocketサーバー/クライアント プログラムであり、WebSocketその中核となるものでもあります。

操作結果:

ここに画像の説明を挿入します

ここに画像の説明を挿入します

しかし、これには問題があり、サーバーはメッセージを受信した後に接続を閉じます。永続的な接続を実現したい場合は、ループを使用して処理する必要があります。

async with websockets.connect(uri) as websocket:
    for i in range(10):
        send_data = input("What's your name: ")
        ...

非同期を使用する場合は、以下を追加する必要がありますasync

async def handler(websocket):
    async for message in websocket:
        print(message)

場合によっては、一度に 1 つのクライアントしか接続できないという問題が発生することがありますが、一般的に、これはプログラム内で非同期時間呼び出しを使用していないことが原因です。

たとえば、次の接続ハンドラーは、イベント ループが 1 秒間実行されないようにします。

async def handler(websocket):
    time.sleep(1)
    ...

これを次のように変更します。

async def handler(websocket):
    await asyncio.sleep(1)
    ...

複数のプロセスを起動するにはどうすればよいですか?

複数のプロセスを開始したい場合は、Python組み込みパッケージを使用して実装できます。最初にプロセス プール モジュールをインポートし、次にすべてのプロセスを開始します。マルチプロセスの使用については、記事 Python3 マルチプロセス プログラミング を参照してください

from multiprocessing import Pool

...

def main():
    asyncio.run(start())

if __name__ == '__main__':
    p = Pool(30)
    for i in range(10):
        p.apply_async(main)

    p.close()
    p.join()
    ...

その他のヒントと FAQ については、https: //websockets.readthedocs.io/en/stable/faq/server.htmlを参照してください。

おすすめ

転載: blog.csdn.net/yilovexing/article/details/133124547