今、話題の人工知能(AI)などで人気のPython。初心者に優しいとか言われていますが、全然優しくない! という事を、つらつら、愚痴っていきます

273.ラズパイ無双[16_WebSocket]

»

初回:2022/9/7

 Raspberry Pi (ラズベリーパイ、通称"ラズパイ")で何か作ってみようという新シリーズです。『WebSocket』ベースの画像配信サーバーを構築していきたいと書きましたが、まずは、各種モジュールの選定から始めましょう。

P子「すでに選定済みなんじゃなかった?」※1

 実は、選定したというより、一番最初にサンプルを見つけて使っただけなので、今はこれが主流ですというのがあれば、ぜひ教えて頂きたいと思っています。

【目次】

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の仮想女性の心の声です。

Comment(0)

コメント

コメントを投稿する