Skip to main content
 首页 » 编程设计

任务的 Python 并行化(事件循环)

2025年05月04日7bhlsheji

现状

我正在写 a small Python program在您的终端中播放 8tracks 中的播放列表。

它由三部分组成,一个使用标准库的cmd的client.py模块,一个使用 python-requests 访问 API 的 api.py 模块和一个在从属模式下创建 mplayer 子进程并向其发送命令的 player.py 模块。

问题

到目前为止,这是可行的,问题是除了轮询子进程的标准输出外,我没有其他方法可以判断歌曲是否已在 mplayer 中播放完毕。这意味着我必须观看该过程,以便在一首歌曲播放完毕后请求并开始播放列表中的下一首歌曲。

问题是等待子进程会阻塞 cmd 模块的主循环。不过,我不能简单地在单独的线程或进程中运行它,因为我必须共享对子进程标准输出的引用,并且不能在进程之间共享此类引用。

可能的方法

为此我想到了不同的解决方案。我可以将 player.py 放在一个单独的进程中并通过队列发送文本命令,但这会使事情过于复杂。我可以创建一个 Twisted 应用程序,但 Twisted 非常大,我不知道从哪里开始。另外,我不希望在我的项目中有这样的依赖。

第三种解决方案是使用 Gevent。问题是我如何让它与 cmd 模块一起工作。就我对 Gevent 的理解而言,我将不得不在我“等待”某事的每个地方屈服。在这种情况下,这将发生在 HTTP 请求期间、cmd.cmdloop() 等待期间以及子进程轮询之间的暂停期间。但是如何让 cmd 模块产生呢?某种子类或猴子补丁?

请您参考如下方法:

从您的代码来看,您可以在与 mplayer 通信时使用 pexpect。 Pexpect(或 expect 就此而言)非常适合来回 stdio 通信。