问题描述
我正在树莓派上开发一个小型媒体播放器应用程序。所以这有两个主要功能。即收音机和文件播放器。如果在下面的文件播放器中输入代码:
process = subprocess.Popen(['omxplayer',songs[0],'-o','local'],stdout=subprocess.PIPE )
#stdout = process.communicate()[0]
nxt=0
while True:
print("looping")
output = process.stdout.readline()
if nxt>1:
process = subprocess.Popen(['omxplayer',songs[nxt],stdout=subprocess.PIPE)
output = process.stdout.readline()
#stdout = process.communicate()[0]
if output =='' :
print("2")
if output:
print("finshed")
nxt=nxt+1
if GPIO.input(7)==0:
break
问题是此循环之后和之外的代码在子进程完成之前不起作用。如何使用 ayncio 以便可以获取一些 gpio 读数并在需要时退出此循环?我真的花了 8 个小时来弄清楚这个谷歌搜索。但是所有可用的教程都很难理解。
解决方法
如果您正在与实时流程交互,则需要有一些句柄来执行此操作 - 通常这看起来像 socket,这似乎是流程对这些示例的期望(简要略读)
- https://www.raspberrypi.org/forums/viewtopic.php?t=28614
- https://github.com/stifi/Python-omxplayer-Socket
但是,为了让您的 Python 进程在管理它的同时也执行一些逻辑,您需要以下其中一项
- threading:可能更容易推理,但有更多麻烦的警告(有限的最大交互、清理、序列化命令..)
- asyncio:总体上可能是最佳选择,但一开始可能更难推理
- multiprocessing:类似于线程,但可能是最难推理的(即进程如何通信?)并且对您的情况最不利(仅写入或读取套接字)
这超出了问题的范围,但要开始,您可能会发现很容易
- 编写一个与套接字交互的小测试脚本以了解它们的工作原理
- 使用一个不错但简单的异步网络框架(如 Tornado)来了解异步逻辑的行为
- 使用 with Tornado's IOStream logic 组合它们以制作完整示例
- 继续您的新设计理念