根据密钥向特定的go例程发送消息

时间:2019-03-27 12:31:58

标签: go concurrency goroutine

我想实现以下内容:

  • 正在运行多个worker goroutine,每个goroutine执行一些业务逻辑。
  • 不同的Http处理程序将工作分配给这些工作者。
  • (通过通道)每个goroutine的输入将是一些数据(状态),其中将包含一个Key。
  • 具有相同键的多个数据也是可以的。

我们的要求是必须对特定密钥的处理进行序列化。例如例行程序1正在处理与Key:1234相关的数据,那么在例行程序1进行其工作之前,其他例行程序不应处理同一密钥的其他数据。

有人可以建议最好的方法吗?

1 个答案:

答案 0 :(得分:0)

我正在使用map [Key] chan状态图来存储Key到Channel的映射。为每个Key创建Go例程。

var keymap sync.Map
func handle_webservice(req WebReq) {
    val, ok := keymap.Load(req.Key)
    if ok {
        val1, _ := val.(chan Event)
        val1 <- Event{Data: req}
    } else {
        ch := make(chan Event, 5)
        go Worker(ch)
        keymap.Store(req.Key, ch)
        ch <- Event{Source: WEBSERVICE, Data: req}
    }

func sendToWorker(event Event) {
    val, ok := keymap.Load(event.Key)
    if ok {
        val1, _ := val.(chan Event)
        select {
        case val1 <- event:
        default:

        }
    } 
}