obnizのフォーラムは新しいシステムに移行しております。
新しいフォーラムはこちらになりますPythonプログラムのobnizコネクト維持時間について
-
Pythonの場合connectしてから一定時間すると本体DisplayがID表示に戻ってしまうのですが、ひういう仕組みになっているのでしょうか? connectを維持させる方法はあるでしょうか?
-
@Google-Homer いえ、期待する動きではありません。接続維持に問題がある可能性があります。一定時間はどのぐらいの時間でしょうか、調査いたします。
-
再現テストしようと思ったのですが、その前に一つ関係しそうな新たな質問です。
下記コードを実行するとprintで999が表示された後にLEDが点灯します。これは正常動作でしょうか? (Pythonの基本的なことがわかっていません。)
-
@Google-Homer なるほど。確認します。
-
こちら、進展いかがでしょうか?
-
こちら、お願いします。
-
下記コードを実行するとprintで999が表示された後にLEDが点灯します。これは正常動作でしょうか? (Pythonの基本的なことがわかっていません。)
こちらですが、正常動作になります。
JavaScriptでも同じ挙動になるかと思います。python/javascriptの言語使用として、長い時間使われるようなループ(今回のfor文)が処理内にあると、そこで実行が専有されるので他の処理ができなくなります。
今回は、そのためにコマンド送信が後回しになっていますが、例えばadなどのデータ受信も後回しになってしまいますし、 他の処理も後回しになります。
これの対応としては、長い時間かかるようなforループにはobniz.waitを入れていただければ後回しにならなくなります。
for i in range(1000): print(i) await obniz.wait(0)
-
await obniz.wait(0)を入れたら、新たに下記エラーが出力されました。
======================== RESTART: C:\python\test02.py ========================
WebSocket connection is closed: code = 1000 (OK), no reason
_call_on_connect
0
Task exception was never retrieved
future: <Task finished coro=<onconnect() done, defined at C:\python\test02.py:6> exception=TypeError("object NoneType can't be used in 'await' expression")>
Traceback (most recent call last):
File "C:\python\test02.py", line 11, in onconnect
await obniz.wait(0)
TypeError: object NoneType can't be used in 'await' expressionimport asyncio from time import sleep from obniz import Obniz async def onconnect(obniz): obniz.io1.output(False) obniz.io0.output(True) for i in range(1000): print(i) await obniz.wait(0) obniz = Obniz('XXXX-XXXX') obniz.onconnect = onconnect asyncio.get_event_loop().run_forever()
-
失礼しました、obniz.py v0.2.0でobniz.waitが使えないバグがあったようです。
v0.3.0で対応します。それまでの間は、
await asyncio.sleep(0)
を使っていただけないでしょうか。async def onconnect(obniz): obniz.io1.output(False) obniz.io0.output(True) for i in range(100000): print(i) await asyncio.sleep(0)
-
上記代替方式で期待動作できました。ありがとうございました。
理屈としては、「obnizへの指令がJavascriptとobniz間で非同期でやり取りされるが、obnizへの指令直後にforループ内でCPUを占有してしまい、指令のやり取りが待たされていた」という解釈でよいでしょうか。
いちを、この仮説を証明するためにfor文中ではなくfor文の直前にawaitを入れても動作しました。
-
はい、その理解であっています。
-
スッキリです。ありがとうございました。