gpt4 book ai didi

multithreading - 使用流时出现 Haskell 破管错误

转载 作者:行者123 更新时间:2023-12-05 03:16:53 35 4
gpt4 key购买 nike

我正在尝试使用流构建一个播放器。主要思想是让一个线程运行一个播放器,该播放器从另一个同时下载 youtube 音频的线程读取字节。代码工作了一段时间并且内容正确流式传输,但几秒钟后我总是收到此错误:异常:fd:13: hPutBuf: 资源消失(管道损坏)

我想我遗漏了什么,因为即使使用 connect 函数,结果也是一样的。这是代码(已简化):

import Control.Concurrent
import System.IO.Streams
import Data.ByteString

main = do
(sink,_,_,_) <- runInteractiveCommand "mplayer -novideo - cache 5096 -"
mainSink <- lockingOutputStream sink -- main audio stream, goes straight to player

(_,source,_,_) <- runInteractiveCommand "yt-dlp \"https://www.youtube.com/watch?v=uFtfDK39ZhI\" -f bv+ba -o -"
loop mainSink source


loop :: OutputStream ByteString -> InputStream ByteString -> IO ()
loop sink src = do
sourceBytes <- peek src
case sourceBytes of
Nothing -> do loop sink src
Just _ -> do
audioBytes <- read src
write audioBytes sink
loop sink src

最佳答案

问题似乎是 mplayer 在 stdout 和 stderr 上生成其通常的冗长终端输出,而 yt-dlp 也在 stderr 上生成类似的输出。由于您将这些句柄扔掉并且永远不会耗尽它们,最终管道缓冲区会填满,并且进程会卡住。我不能准确地说出为什么其中一个或两个进程终止而不是挂起,但这就是正在发生的事情。这是一个将不需要的输出重定向到 /dev/null 并且看起来有效的简单示例:

import System.IO.Streams

main = do
(sink,_,_,_) <- runInteractiveCommand "mplayer -cache 5096 - 2>/dev/null >&2"
(_,source,_,_) <- runInteractiveCommand "yt-dlp \"https://www.youtube.com/watch?v=uFtfDK39ZhI\" -f bv+ba -o - 2>/dev/null"
connect source sink

关于multithreading - 使用流时出现 Haskell 破管错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74421700/

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