想要简单的python异步方法

问题描述

我正在树莓派上开发一个小型媒体播放器应用程序。所以这有两个主要功能。即收音机和文件播放器。如果在下面的文件播放器中输入代码

        
        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,这似乎是流程对这些示例的期望(简要略读)

但是,为了让您的 Python 进程在管理它的同时也执行一些逻辑,您需要以下其中一项

  • threading:可能更容易推理,但有更多麻烦的警告(有限的最大交互、清理、序列化命令..)
  • asyncio:总体上可能是最佳选择,但一开始可能更难推理
  • multiprocessing:类似于线程,但可能是最难推理的(即进程如何通信?)并且对您的情况最不利(仅写入或读取套接字)

这超出了问题的范围,但要开始,您可能会发现很容易

  • 编写一个与套接字交互的小测试脚本以了解它们的工作原理
  • 使用一个不错但简单的异步网络框架(如 Tornado)来了解异步逻辑的行为
  • 使用 with Tornado's IOStream logic 组合它们以制作完整示例
  • 继续您的新设计理念

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...