我正在尝试处理音频信号的通道.我得到信号作为帧的列表,其中每个帧具有每个通道的样本.现在我想独立处理流然后再合并它们.所以我想要
type Sample = Double
type Frame = [Sample]
type Stream = [Sample]
mux :: [Stream] -> [Frame]
demux :: [Frame] -> [Stream]
process :: Stream -> Stream
output = (mux . (map process) . demux) input
mux [[0.1, -0.1, -0.3], [0.2, 0.4, 0.6]] = [[0.1, 0.2], [-0.1, 0.4], [-0.3, 0.6]]
demux [[0.1, 0.2], [-0.1, 0.4], [-0.3, 0.6]] = [[0.1, -0.1, -0.3], [0.2, 0.4, 0.6]]
Run Code Online (Sandbox Code Playgroud)
因为流很长,mux而且demux必须是懒惰的而不是评估整个列表.
多路复用器似乎很简单.我唯一不喜欢这个版本的是难以阅读的模式匹配.
mux streams@((_:_):_) = map head streams : mux (map …Run Code Online (Sandbox Code Playgroud) 我有一个我正在处理的应用程序需要几个辅助线程,每个应用程序都要负责一些文件句柄(至少1个,超过10个).文件句柄不在线程之间共享,因此我不必担心一个辅助线程在select查看准备读/写的内容时阻塞另一个.我想要确定的是,在执行select/ pselectcall时,两个辅助线程都不会导致主线程停止执行.
我认为这不是一个问题 - 人们可以想象这样的事情会在网络服务器上完成 - 但我找不到任何具体说"是的,你可以这样做",当我用Google搜索时.我是否认为这不会导致任何问题?
为了澄清,我看到的是:
主要执行线程(select()循环处理传入命令消息和传出响应)
辅助线程#1(select()提供服务的循环)
辅助线程#2(select()提供另一个服务的循环)
正如我之前提到的,没有一个文件句柄在线程之间共享 - 它们是在一个单独的线程中创建,使用和销毁的,其他线程不知道它们的存在.
我正在寻找一种解决方案,可以多路传输一些通道输出。
我有一个数据源,它是从io.Reader我发送到单个通道的读取的。另一方面,我有一个从通道读取的websocket请求处理程序。现在,发生了两个客户端创建一个websocket连接的情况,这两个客户端都从同一通道读取内容,但是每个客户端仅获得部分消息。
代码示例(简体):
func (b *Bootloader) ReadLog() (<-chan []byte, error) {
if b.logCh != nil {
logrus.Warn("ReadLog called while channel already exists!")
return b.logCh, nil // This is where we get problems
}
b.logCh = make(chan []byte, 0)
go func() {
buf := make([]byte, 1024)
for {
n, err := b.p.Read(buf)
if err == nil {
msg := make([]byte, n)
copy(msg, buf[:n])
b.logCh <- msg
} else {
break
}
}
close(b.logCh)
b.logCh = nil
}()
return b.logCh, …Run Code Online (Sandbox Code Playgroud) 所以我是C#的新手,但是我已经想从其他更高级别的语言中得到的一件事就是能够在(接近)C中进行按位操作.我有一堆函数,其中一些或所有参数都是可选的,我喜欢开关,所以我构建了一个函数,将布尔数组转换为无符号的Shorts,这允许我基本上将一个布尔数组Mux为交换机的单个值:
namespace firstAsp.Helpers{
public class argMux{
public static ushort ba2ushort (bool[] parms){
//initialize position and output
ushort result = 0;
int i = parms.Length-1;
foreach (bool b in parms){
if (b)//put a one in byte at position of b
//bitwise or with position
result |= (ushort)(1<<i);
i--;
}
return result;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个示例用例:
public IActionResult Cheese(string fname,string lname)
{
bool[] tf = {fname!=null,lname!=null};
switch(argMux.ba2ushort(tf)){
case 3:
@ViewData["Data"]=$"Hello, {fname} {lname}";
break;
case 2:
@ViewData["Data"]=$"Hello, {fname}";
break;
case 1:
@ViewData["Data"]=$"Hello, Dr. …Run Code Online (Sandbox Code Playgroud)