Golang Thread-Pool调度程序的目的和顺序

时间:2016-10-06 20:55:15

标签: multithreading go threadpool goroutine

我刚刚在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
  3. 阅读完这两篇文章后,我发现自己有两个关于线程池的问题:

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

1 个答案:

答案 0 :(得分:0)

  1. 工作池的目的是限制工作者执行的任务的并发性。这在执行需要的任务时很有用 足够的资源(CPU,内存等),并在运行太多的任务 同一时间会耗尽资源。

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

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