Python
websocket
サービスの実装は非常に簡単です。利用可能なサードパーティ パッケージが多数あります。インターネット上でよく使用される 3 つのパッケージを見つけました: websocket
、websockets
、Flask-Sockets
。
websocket
しかし、これらのパッケージの多くは、2016 年時点では2010
メンテナンスされていないなど、「荒廃」しています。
そしてメンテナンスFlask-Sockets
も2016
年内に終了しました。
また、サードパーティのパッケージを使用する場合は、そのパッケージがまだメンテナンスされているかどうかを必ず確認してください。作成者がメンテナンスを停止している場合は、そのパッケージを再度使用しないでください。メンテナンスにはそれほど時間がかかりません。あなたがそれを食べるのは大きな損失です。
ウェブソケット
メンテナンスされなくなった 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を参照してください。