gpt4 book ai didi

multithreading - Golang 线程池调度程序的目的和顺序

转载 作者:数据小太阳 更新时间:2023-10-29 03:26:31 26 4
gpt4 key购买 nike

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

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

首先,我想为每个需要加密的数据包创建一个新的 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 来使用公共(public) channel 进行加密?每个 goroutine 都会尽可能地处理数据包。这种方法有缺点吗?
  2. 如果我想保持数据包的顺序,这意味着来自 UDP 的第一个数据包将首先由 TCP 发送,然后是第二个,依此类推...并且只想在加密部分并行化程序,我可以指望多个 goroutine\thread-pool 来保持正确的顺序吗?我想答案是否定的,但想知道是否有人对此问题有解决方案。

感谢

最佳答案

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

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

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

关于multithreading - Golang 线程池调度程序的目的和顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39905466/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com