obnizのフォーラムは新しいシステムに移行しております。

新しいフォーラムはこちらになります

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



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



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



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



  • @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()
    


  • @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を入れても動作しました。



  • @Google-Homer さん

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



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



SUGGESTED TOPICS