golang:如何用线程绑定代码?

时间:2017-03-28 06:28:25

标签: multithreading go

我几乎已经实现了面部识别Go服务器。我的人脸识别算法使用caffecaffe是一个线程绑定图形库,这意味着我必须在同一个线程中初始化并调用算法,所以我检查了LockOSThread()

LockOSThread使用1个线程,但我的服务器拥有4个GPU。

C/C++中,我可以创建4个线程,在每个线程中初始化算法,使用sem_waitsem_post分配任务,1个线程使用1个GPU。

如何在Go中做同样的事情,如何用线程绑定代码?

1 个答案:

答案 0 :(得分:2)

你生成一些的goroutines,每个都运行runtime.LockOSThread() 然后在每个图形库中初始化。

然后使用常规Go通信原语向这些原语发送任务 够程。通常,最简单的方法是让每个goroutine读取"任务"来自频道并发回结果,如

type Task struct {
  Data DataTypeToContainRecognitionTask
  Result chan<- DataTypeToContainRecognitionResult
}

func GoroutineLoop(tasks <-chan Task) {
  for task := range tasks {
    task.Result <- recognize(Data)
  }
}

tasks := make(chan Task)
for n := 4; n > 0; n-- {
  go GoroutineLoop(tasks)
}

for {
  res := make(chan DataTypeToContainRecognitionResult)
  tasks <- Task{
    Data: makeRecognitionData(),
    Result: res,
  }

  result <- res
  // Do something with the result
}

至于确定要开始多少goroutines,存在不同 策略。 最简单的方法可能是查询runtime.NumCPU() 并使用此号码。