Pythonプログラムのobnizコネクト維持時間について



  • 再現テストしようと思ったのですが、その前に一つ関係しそうな新たな質問です。
    下記コードを実行するとprintで999が表示された後にLEDが点灯します。これは正常動作でしょうか? (Pythonの基本的なことがわかっていません。)

    0_1556420154105_18cc9dc3-747c-4ad9-9c6f-64e4caadbf79-image.png

    0_1556420625331_95933acb-12fb-4e63-b1ec-87d20475a4cc-image.png

    0_1556420421241_0f2b3aca-3a19-4959-bfc5-eedee608d83b-image.png

    0_1556420468356_e8f8be7a-57d2-4482-8c19-d2ba869df010-image.png


  • administrators

    @Google-Homer なるほど。確認します。



  • こちら、進展いかがでしょうか?



  • こちら、お願いします。


  • administrators

    @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' expression

    
    import 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()
    

  • administrators

    @Google-Homer さん

    失礼しました、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を入れても動作しました。


  • administrators

    @Google-Homer さん

    はい、その理解であっています。



  • スッキリです。ありがとうございました。


 

Recent Projects

  • @nak435 かしこまりました。よろしくお願いします。

    read more
  • @Yuki-Sato さん、

    外部の3.3vを使うとはいえ普通にvccやgndを供給して問題なくうごくのであれば、弊社での動作確認後Flick Hatのライブラリとして公開できればと思っているのですがいかがでしょう。

    今週末に確認しますので、お待ちください。

    read more
  • @nak435 時間がかかってすいません、

    なんとか3.3vをgndにつないでFlick Largeを動かしたかったのですが、うまく動かすことができなかったです。
    3.3vをgndを繋がずに接続するというのはライブラリで推奨して伝えることは難しいと思ってます。

    Flick LargeでなくFlick Hatの方で、外部の3.3vを使うとはいえ普通にvccやgndを供給して問題なくうごくのであれば、弊社での動作確認後Flick Hatのライブラリとして公開できればと思っているのですがいかがでしょう。

    よろしくお願い致します。

    read more
  • @nak435 ありがとうございます。
    接続は3.3vのgnd以外同じでした。
    エラーはそのせいかもしれませんが、しかし電気的にはgndを繋がない場合3.3vとしてうまく供給できないはずなのでそこが不思議です。

    教えていただいたプログラムの部分を修正して試してみたいと思います。
    また少し時間がかかりそうなのですが、早めに試したいと思います。

    引き続きよろしくお願い致します。

    read more