金宏和實です。
https://qiita.com/Hiroki-Fujimoto/items/01da24ca8b866973d219
上記のアフレルの方が書いておられる記事のようにSpikeアプリ2.xでは非同期処理はuasyncioモジュールを使う必要があったようだが、Spikeアプリ3.xにはrunloopモジュールが付属しており、このモジュールを使って非同期処理を作ることができるようだ。
そこで少し、runloopの使い方を探ってみたい。
非同期処理を使うとマルチタスクが実現できるというのがプログラミングの一般的な説明だと思うのだが、runloopを使うと複数のコマンドを同時に実行したり、順に実行したりできる。簡単にできるという点がメリットだろうか。
runloopを使わないない次のプログラムは二つのモーターを同時に動かす。いわゆる普通の処理だ。
import motor
from hub import port
motor.run_for_degrees(port.C, 360, 720) #引数は順にポート、角度、速さ
motor.run_for_degrees(port.D, 360, 720)
次にrunloopを使ってみる
import motor
import runloop
from hub import port
async def main():
velocity = 720 #速さ
await motor.run_for_degrees(port.C, 360, velocity)
await motor.run_for_degrees(port.D, 360, velocity)
runloop.run(main())
runloop.run()で実行する関数にはasync(非同期のという意味)を付けるが、このプログラムを実行するとモータC、モータDの順に動き、同時には動かない。なぜかというとawait(待つ)が付いているから。
次のように、awaitを削除すると二つのモーターは同時に動く
import motor
import runloop
from hub import port
async def main():
velocity = 720 #速さ
motor.run_for_degrees(port.C, 360, velocity)
motor.run_for_degrees(port.D, 360, velocity)
runloop.run(main())