2013-04-06 38 views
0

我正在写一个自定义视频格式的解码器和编码器(QTC)。解码过程包括多个阶段,其中,每个级的输出被传递到下一级的:推荐方法来并行化多通道算法

  1. 反序列化输入流
  2. 生成符号序列具有一定范围编码器
  3. 产生的一个流从所述符号流
  4. 图像序列化图像流转换为输出格式

步骤三和四占用几乎全部的处理时间,步骤3需要大约35%,第一ep四大约需要60%,第一步和最后一步都是微不足道的。

什么是平行运行四个步骤的推荐和意识形态方法?我最感兴趣的是如何处理部件之间的沟通。我打算使用一个Goroutine进行第二步,一个进行第三步,例程与缓冲通道连接。这是正确的方式吗?

+0

我会说你的计划是好的!这也意味着你可以通过让步骤3和步骤4中的多个独立工作人员(如果算法允许)通过增加更多日常工作来加快速度。所有的并行工作人员都可以从同一个通道读取并写入同一个通道。 – 2013-04-08 18:31:10

+0

@Nick算法对视频数据进行编码。这尤其意味着每帧的编码取决于前一帧,因此必须等待一帧完成编码以处理下一帧。 – fuz 2013-04-08 19:09:13

回答

3

对于某些具有“共享”数据结构的任务,通过谨慎使用mutexes“受保护”会更容易,但缓冲通道将成为在Go中执行此操作的“标准”方式,对于您的任务,听起来像是正确也是解决方案。

您是否遇到过任何问题?

+0

在编写代码之前,我更愿意考虑我的问题。似乎共享数据流的优先方法是使用io.Reader和io.Write组接口。但另一方面,有些渠道提供了几乎相同的功能。使用共享数据结构永远不会出现在我的脑海里,因为Go的信条说:*不要通过共享内存进行通信;通过通信共享内存。* – fuz 2013-04-06 20:54:27

+0

使用通道比使用io.Reader/io.Writer处理更合适(尽管我没有把它当作一个选项来考虑)。如果没有其他的渠道,那么渠道可以帮助您无时无刻地解压/打包结构/数据。 – 2013-04-06 23:12:38

0

不要过度思考。只需编写一些代码。 Go代码很容易改变 - 编译器握住你的手。写一些测试/基准来保持自己的诚实。

亚历克斯

+0

对不起。在编写解决方案之前,我更喜欢大致了解如何解决问题。 – fuz 2014-09-14 14:33:47