gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:43:07 24 4
gpt4 key购买 nike

现状

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

它由三部分组成,一个使用标准库的cmdclient.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 通信。

关于任务的 Python 并行化(事件循环?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15896114/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com