【问题标题】:Golang Thread-Pool dispatcher purpose and orderGolang 线程池调度程序的用途和顺序
【发布时间】:2018-06-02 09:18:45
【问题描述】:

我刚刚在go中写完一个简单的代理应用程序:代码从一个接口获取UDP数据包,加密数据,然后使用TCP将其发送到另一个接口。

目前,我正在使用三个 goroutine:一个用于接收,一个用于加密,一个用于发送数据。我刚刚开始尝试寻找提高代码效率和速度的方法。

首先,我考虑为每个需要加密的数据包创建一个新的 goroutine,但在阅读了以下两篇博文后,我明白这不是正确的做法:

  1. http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/
  2. http://nesv.github.io/golang/2014/02/25/worker-queues-in-go.html

读完这两篇文章后,我发现自己有两个关于线程池的问题:

  1. 为什么我应该使用线程池而不是创建“x”goroutines 来使用公共通道进行加密?每个 goroutine 都会尽可能地处理数据包。这种方法有缺点吗?
  2. 如果我想保持数据包的顺序,这意味着来自 UDP 的第一个数据包将是 TCP 发送的第一个数据包,然后是第二个等等......并且只想在加密部分并行化程序,我可以依靠多个 goroutine\thread-pool 来保持正确的顺序吗?我想答案是否定的,但想知道是否有人对此问题有解决方案。

谢谢

【问题讨论】:

  • #1 是什么意思?使用公共通道创建 X goroutine 在概念上与“线程池”相同。
  • 两篇博文中线程池的使用是没有公共通道的。两个程序都使用不同的通道到每个带有调度程序的 goroutine。
  • 看看信号量

标签: multithreading go threadpool goroutine


【解决方案1】:
  1. 工作池的目的是限制工作人员执行的任务的并发性。这在执行需要的任务时很有用 足够的资源(CPU、内存等),同时运行的任务太多 同时会耗尽资源。

  2. 使用工作器池,任务被分派给可用的工作器。如果将单独的任务(在您的情况下是要加密的数据包)分派给单独的工作人员,那么您无法确定首先执行哪个工作人员(goroutine),并且将不知道任务完成的顺序。

如果您想并行化加密任务,但需要保持顺序,则可以在收到输入时为每个数据包/任务分配一个索引。当工作池完成每个任务时,可以将输出放入排序容器中,例如heap,其中根据索引进行排序。一旦序列中具有下一个索引的加密数据包位于堆顶部,它就会从堆中弹出并发送。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多