
No.4ベストアンサー
- 回答日時:
> Pythonコード上でそれぞれどのように書くのでしょうか
socketを使って自作するならrecvを呼び出せばデフォルトでは受信するまで待ちますけど。
あとタイムアウトはエラーを吐かせるのではなく、タイムアウト時間を設定しているとタイムアウトで例外が発生するので例外を拾ってエラーにならないように続きを実行するように書くのです。なぜならタイムアウトはキーブレイクなどを確実に受け取るためにOSから制御を戻すために設定しているのでタイムアウトが起こることは異常ではないからです。もしかするとLinux系だとソケットのタイムアウトを設定しなくてもキーブレイクを受け取れるかもしれませんが、少なくともWindows環境ではソケットを待っている間はキーブレイクも受け取ってくれないので、タイムアウト設定はそれに対する対策ですね。キーブレイクさせる必要がなければタイムアウトなしの方が簡単でしょう。
ただWebsocketのパッケージを使うというなら、上記のような記述は不要と思います。適当なイベントハンドラを設定してrun_foreverを呼び出せばイベントループ処理はライブラリ内でやってくれるので無限ループを自作する必要はないです。(下記サイト参照)
なお下記サイトの長く保つクライアント例ではon_openハンドラで色々と書いていますが、クライアントがサーバーからのメッセージを受けて作業をするならon_messageハンドラの方に実作業の記述をすることになるでしょう。
PythonでWebSocketのお勉強
https://make-muda.net/2017/10/5645/
No.3
- 回答日時:
> while True:
> if 受信したら
> 処理
この構造自体は問題ありませんけど『受信したら』の部分がOSコールで受信まで待つのでなく待ちなしのチェック&ループならCPU負荷が異常に高くなっているかもしれません。ラズパイって初代ですか?
ノンブロッキングコールになっているようなら受信までブロックするかせめて0.1秒以上のタイムアウトを設定して受信しないときのループを抑制しないと拙いですね。なおタイムアウトは例外になるので例外処理必須です。
No.1
- 回答日時:
ラズパイかどうかは関係なくて、それはOSに依存する話ではないでしょうか。
Windows系ならサービスに登録して自動起動にすればいいし、Linux系ならrcでサービスを起動するとかいろいろです。
で、それをしておいても起動に失敗するなら、リソースモニターとかtopとかで監視しながら手動で起動してみて原因を探るとか、sarで記録を取っておいて確認するとかでしょうか。
まぁそれが面倒なら怪しいところにsleep入れながら試すとか、起動の順序を考え直してみるとかでしょうか。
スクリプトが無限ループしてるとかでは無いんですよね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- その他(プログラミング・Web制作) Raspberry Pi Picoについて 1 2023/04/19 13:57
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- AJAX RPA(PowerAutomate)の実装について 1 2023/07/31 13:46
- その他(セキュリティ) これはDos攻撃になりますか? 1 2022/06/30 09:46
- その他(プログラミング・Web制作) 監視カメラを水平につないでパノラマの映像を作りたい 1 2022/09/06 15:26
- その他(パソコン・周辺機器) raspberry piでMP3再生問題 3 2023/01/29 09:05
- その他(OS) raspberry pi のスピーカ音出ない問題 2 2022/07/24 09:03
- その他(プログラミング・Web制作) VS codeを使って、ラズパイ Picoを動かせる簡単な方法 1 2023/04/27 13:49
- 宗教学 【宗教】統一教会の何が悪いのか理解できない。 (統一教会が悪いと言っている人たちの 4 2022/09/13 23:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
数学、プログラミング、物理、...
-
画像生成AIのプロンプトの作り...
-
Python... 環境設定 初心者です...
-
OS入ってる機器のソフト・アプ...
-
pip --versionがエラーになる
-
パイソンのソースコードをChatG...
-
pythonの実行に関する質問
-
Python 3.12.2 か一番最新のパ...
-
CSVファイルの複数行削除
-
Webサイト内に埋め込んだmp4動...
-
ExcelVBAでFormulaR1C1を列範囲...
-
Pythonのエラーメッセージをコ...
-
ネットワークフォルダの中身を...
-
Pythonで仮想通貨の自動売買が...
-
AIの登場でプログラマーたちが...
-
Google ColaboでGUI作成
-
Pythonについて。
-
HTMLソースが表示のページのも...
-
MOVEコマンドでサブフォルダー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
CSVファイルの複数行削除
-
OS入ってる機器のソフト・アプ...
-
Python 3.12.2 か一番最新のパ...
-
pythonの実行に関する質問
-
パイソンのソースコードをChatG...
-
画像生成AIのプロンプトの作り...
-
数学、プログラミング、物理、...
-
pip --versionがエラーになる
-
Google ColaboでGUI作成
-
Python... 環境設定 初心者です...
-
HTMLソースが表示のページのも...
-
ネットワークフォルダの中身を...
-
MOVEコマンドでサブフォルダー...
-
google Colabでmatplotlibの描...
-
VBAでパワーシェルを実行したい...
-
Pythonでの文字列からfloatへの...
-
Webサイト内に埋め込んだmp4動...
-
初心者powershellのPS1ファイル...
-
pythonについて(初心者です)
おすすめ情報
lowrider_2005さん回答ありがとうございます。
自動起動単体では成功したのを確認しています。
Linuxで、rc.localにsudo python3 /○○/.../○○.py
のようになっており、テキストファイルの数値を自動起動度に、カウントアップ書き換えさせました。
現在、自分で上記の1文だけ書き換えて自動起動させているのは、以下の受信待ちプログラム1つだけです。
Pythonプログラムで、
while True:
if 受信したら
処理
のようになっています。
この受信待ちプログラムを動かすと、真っ暗な画面にマウスポインタだけある範囲内だけ動かせるような状態になります。
自動起動前に手動で受信待ちプログラムを実行するときは正常に動きました。
手動で動かしてリソースモニター、topで確認、
自動起動でsarで記録を録る、などを試してみたいと思います。
これらの問題は仕方のないことなのでしょうか?
受信待ちのプログラムはよく作られるものだと思うのですが、結局はsleepを入れて、受信ループの速度を遅らせるしかないのでしょうか?
すいません訂正がありました。
sudo python3 ○○.py ではなく
sudo python3 ○○.py &でした
バックグラウンドで動かしています
バックグラウンドで動かしたらプログラムが終了しなくとも、デスクトップ画面が出ても良さそうですが、黒い画面にマウスカーソルがあるだけで止まってしまいます。
回答ありがとうございます!
ラズパイは3Bです。
受信までブロックする、か、タイムアウトでエラーを吐かせる、ようにするのですね!
Pythonコード上でそれぞれどのように書くのでしょうか
そのようなモジュールがあるのでしょうか
タイムアウトでエラーを吐く場合は
時刻を測り、ある時間間隔が経ったら、という条件分岐して、raiseで例外を発生させるのでしょうか?
返信ありがとうございます!
ウェブソケットが常時抜けて無限ループになっているのではなく、ブロックしてくれているのは分かっていたのですが、説明が複雑になると思い、正確に書いていませんでした。すみません!
また、タイムアウトの設定ができるのを知りませんでした!
Windowsの場合はタイムアウトつけることにより、
キーブレイクできるようになるのですね!
丁寧に答えていただきありがとうございます!!
そもそも無限ループで常時チェックするようなプログラムは良くないのは思っていたのですが、
ソケット通信や、ウェブソケット、GUIなど、ある程度用意されたものしか、待っている間ブロック、というのができないと思っており、用意されてないものをやるときはsleepを入れるのしかないのか?と悩んでいました!
しかし、 Queueのget()でブロック待ちできたり、
selectモジュールなどがあることを知り、モヤモヤが解消しました!
ありがとうございます!