我刚刚在go中编写了一个简单的代理应用程序:代码从一个接口获取UDP数据包,加密数据然后使用TCP将其发送到另一个接口。
目前,我正在使用三个goroutine:一个用于接收,一个用于加密,一个用于发送数据。我刚刚开始尝试找到提高代码效率和速度的方法。
首先,我考虑为每个需要加密的数据包创建一个新的goroutine但是在阅读了以下两篇博客文章之后我才知道这不是正确的事情:
阅读完这两篇文章后,我发现自己有两个关于线程池的问题:
感谢
答案 0 :(得分:0)
工作池的目的是限制工作者执行的任务的并发性。这在执行需要的任务时很有用 足够的资源(CPU,内存等),并在运行太多的任务 同一时间会耗尽资源。
使用工作池,可以将任务分派给可用的工作人员。如果将单独的任务(在您的情况下为加密的数据包)分派给单独的工作人员,那么您无法确定首先执行哪个工作程序(goroutine),并且不知道任务完成的顺序。
如果要并行化加密任务,但需要维护顺序,则可以在收到输入时为每个数据包/任务分配索引。当工作池完成每个任务时,输出可以放入一个已排序的容器,例如heap,根据索引进行排序。只要序列中具有下一个索引的加密数据包位于堆的顶部,它就会从堆中弹出并发送。