【问题标题】:Easy way python async method wanted想要简单的python异步方法
【发布时间】:2021-08-28 03:08:12
【问题描述】:

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

        
        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],'-o','local'], 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 个小时来弄清楚这个谷歌搜索。但是所有可用的教程都很难理解。

【问题讨论】:

    标签: python python-asyncio nest-asyncio


    【解决方案1】:

    如果您正在与实时流程进行交互,则需要有一些句柄才能这样做 - 通常这看起来像 socket,这似乎是流程对这些示例的期望(简要略读)

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

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

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

    • 编写一个与套接字交互的小测试脚本以了解它们的工作原理
    • 使用像 Tornado 这样的优秀但简单的异步 Web 框架来了解异步逻辑的行为方式
    • 将它们与with Tornado's IOStream logic 组合成一个完整的例子
    • 继续您的新设计理念

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      相关资源
      最近更新 更多