【发布时间】:2018-06-02 09:18:45
【问题描述】:
我刚刚在go中写完一个简单的代理应用程序:代码从一个接口获取UDP数据包,加密数据,然后使用TCP将其发送到另一个接口。
目前,我正在使用三个 goroutine:一个用于接收,一个用于加密,一个用于发送数据。我刚刚开始尝试寻找提高代码效率和速度的方法。
首先,我考虑为每个需要加密的数据包创建一个新的 goroutine,但在阅读了以下两篇博文后,我明白这不是正确的做法:
- http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/
- http://nesv.github.io/golang/2014/02/25/worker-queues-in-go.html
读完这两篇文章后,我发现自己有两个关于线程池的问题:
- 为什么我应该使用线程池而不是创建“x”goroutines 来使用公共通道进行加密?每个 goroutine 都会尽可能地处理数据包。这种方法有缺点吗?
- 如果我想保持数据包的顺序,这意味着来自 UDP 的第一个数据包将是 TCP 发送的第一个数据包,然后是第二个等等......并且只想在加密部分并行化程序,我可以依靠多个 goroutine\thread-pool 来保持正确的顺序吗?我想答案是否定的,但想知道是否有人对此问题有解决方案。
谢谢
【问题讨论】:
-
#1 是什么意思?使用公共通道创建 X goroutine 在概念上与“线程池”相同。
-
两篇博文中线程池的使用是没有公共通道的。两个程序都使用不同的通道到每个带有调度程序的 goroutine。
-
看看信号量
标签: multithreading go threadpool goroutine