現在の状況
端末で 8 トラックのプレイリストを再生する小さな Python プログラムを作成しています。
これはclient.py
、stdlib のcmdモジュールapi.py
を使用するモジュール、python-requests を使用して API にアクセスするplayer.py
モジュール、スレーブ モードで mplayer サブプロセスを作成してコマンドを送信するモジュールの 3 つの部分で構成されます。
問題
これはこれまでのところ機能していますが、問題は、サブプロセスの stdout をポーリングする以外に、mplayer で曲の再生が終了したかどうかを確認する方法が他にないことです。これは、曲の再生が終了した後にプレイリストの次の曲をリクエストして開始できるように、プロセスを監視する必要があることを意味します。
問題は、サブプロセスを待機するとcmd
モジュールのメイン ループがブロックされることです。ただし、サブプロセスの標準出力への参照を共有する必要があり、これらのような参照はプロセス間で共有できないため、別のスレッドまたはプロセスで単純に実行することはできません。
可能なアプローチ
これについては、さまざまな解決策を考えました。別のプロセスを作成し、キューを介してテキスト コマンドを送信することもできplayer.py
ますが、それでは複雑すぎます。Twisted アプリを作成できましたが、Twisted は非常に大きく、どこから始めればよいかわかりません。また、プロジェクトにそのような依存関係を持たないことをお勧めします。
3 番目の解決策は、Gevent を使用することです。問題は、これをcmd
モジュールで動作させる方法です。私が理解している限り、私は何かを「待っている」あらゆる場所で屈服しなければなりません。この場合、これは HTTP 要求中、待機中、cmd.cmdloop()
およびサブプロセス ポーリング間の一時停止中です。しかし、どうすればcmd
モジュールを生成できますか? ある種のサブクラスまたはモンキーパッチ?