273.ラズパイ無双[16_WebSocket]
初回:2022/9/7
Raspberry Pi (ラズベリーパイ、通称"ラズパイ")で何か作ってみようという新シリーズです。『WebSocket』ベースの画像配信サーバーを構築していきたいと書きましたが、まずは、各種モジュールの選定から始めましょう。
P子「すでに選定済みなんじゃなかった?」※1
実は、選定したというより、一番最初にサンプルを見つけて使っただけなので、今はこれが主流ですというのがあれば、ぜひ教えて頂きたいと思っています。
【目次】
1.gevent、geventwebsocket
2.bottle.ext.websocket
3.websocket_server
4.asyncio、websockets
5.tornado.websocket
6.WebSocketの注意事項
7.まとめ
1.gevent、geventwebsocket
まずは、これから解説していく予定の『WebSocket』ベースの画像配信サーバーで使用したモジュールの説明です。
≪参考≫
https://doitu.info/blog/5aabc92d31e68500964d9255
PythonとBottleでWebSocketサーバ/クライアントを実装
WebSocket を実現するには、gevent とgevent-websocket をインストールして、下記の3つのクラスをimport します。もちろん、ベースとなるbottleとか、timeとかの import は適宜ご用意ください。
$ pip3 install gevent
$ pip3 install gevent-websocket
from gevent.pywsgi import WSGIServer
from geventwebsocket import WebSocketError
from geventwebsocket.handler import WebSocketHandler
元々、geventとは、非同期処理をベースとしたネットワーク処理のライブラリです。
P子「なんのこっちゃ?」
私もよく判りません。
よく判りませんが、gevent関係のWebSocketモジュールのサンプルが、たまたま、googleで引っ掛かったので、それを使っただけです。こういうのは、『縁(えん)』というものです。
P子「緑(ミドリ)じゃないわよ」
geventは、軽量の協調スレッドであるグリーンレット(greenlets)に基づく軽量の実行ユニットという位置づけになります。
P子「赤(レッド)じゃないわよ」
2.bottle.ext.websocket
これは、Bottleのプラグインという位置づけになりますが、先の gevent と依存関係がありますので、installが必要です。ちなみに、ここから先は、インストールも実行もしたことがありませんので、ご容赦ください。
≪参考≫
https://symfoware.blog.fc2.com/blog-entry-2426.html
BottleフレームワークでWebsocket通信を行う
$ pip3 install gevent
$ pip3 install gevent-websocket
$ pip3 install bottle-websocket
from bottle.ext.websocket import GeventWebSocketServer
from bottle.ext.websocket import websocket
bottle を使ってはいますが、専用というのは少し気になります。
P子「Flask とか使いたい人もいるもんね」
3.websocket_server
websocket-server は、その名の通り、websocket の server です。
≪参考≫
https://teratail.com/questions/356317
websocketとthreadingでの並列処理がうまく動きません。
上記のベストアンサーで、『websocket-serverはマルチスレッドには対応していないとREADMEに書かれています。』とのこと。ただ、コメントで、『websocket-serverというライブラリが、ユーザがマルチスレッドで使用することを想定した作りになっていない、ということだと思います。websocket-serverも内部では、複数クライアントに対応するために、マルチスレッドを使用しています。』と書かれていますが、私自身は何も調査していませんので、真偽のほどが定かではありません。
4.asyncio、websockets
先のコメントで、websocketsというライブラリが紹介されています。
≪参考≫
https://github.com/aaugustin/websockets
『websocketsというライブラリは、Python標準のayncioを採用し、スレッドではなく非同期I/Oを利用することにより、複数処理の同時実行を可能にしています。』
import asyncio
import websockets
≪参考≫
https://qiita.com/yakiimo121/items/7c2ef941a301f5c16153
Python websocketsの疑問点まとめ
websockets ライブラリ は、結構よさそうですが、動かしたことがありませんので、何とも言えません。
P子「出来るか出来ないかではなく、やるか、やらないかでしょ」
5.tornado.websocket
Tornado というのは、Pythonで書かれたWebフレームワークであり、非同期通信ライブラリと言えば、Tornado と言われるほど有名です。
≪参考≫
https://siguniang.wordpress.com/2015/09/23/websocket-server-using-tornado/
tornadoでWebSocketサーバを動かしてみる
import tornado.ioloop
import tornado.web
import tornado.websocket
ただ、今回は、bottle をベースに考えていますので、tornado はご紹介のみとさせていただきます。
P子「gevent-websocket 以外、すべてご紹介のみでしょ」
6.WebSocketの注意事項
pythonで、WebSocket を実現するのは、情報量も多く、比較的簡単に実現できてしまいます。ただし、手軽で便利で高性能だからと言って、いつでもどこでもWebSocket という訳にはいかないでしょう。やはり、安全に使うには、問題も把握しておく必要があると思います。
≪参考≫
https://postd.cc/websockets-caution-required/
WebSocketには注意が必要
2016年2月1日
もちろん、執筆時点から、6年以上も時間が経過していますので、周りの環境や実装レベルの向上など、改善されていることも多々あると思います。逆に、セキュリティ関係の強化も著しいため、WebSocket の プロキシ問題など、悪化している所もあるかもしれません。今回は、ラズパイ上のサーバーという事で、HTTP/2 や、暗号化通信の https 上の wss などは対象外にしていますので、色々と事情も異なってきますが、参考にはしておいた方が良いと思います。
7.まとめ
最初にも書きましたが『WebSocket』ベースの画像配信サーバーで使用したモジュールは、gevent、geventwebsocket です。ここでご紹介したほかのモジュールの方が、現代的とか性能が良いとか、使い勝手が良いなどの条件があるかもしれません。その場合は、コメントで、〇〇の方がいいよ、とか、△△は、使い勝手が良いよとか、ご一報ください。
WebSocket 第二弾という事で、そちらで画像配信サーバーを組みなおすかもしれません。それまでは、現状組んでいる gevent ベースのシステムの解説記事にしたいと思っています。
ほな、さいなら
======= <<注釈>>=======
※1 P子「すでに選定済みなんじゃなかった?」
P子とは、私があこがれているツンデレPythonの仮想女性の心の声です。