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

Multithreading golang:如何用线程绑定代码?,multithreading,go,Multithreading,Go,我几乎实现了一个人脸识别Go服务器。我的人脸识别算法使用caffe,caffe是一个线程绑定的图形库,这意味着我必须在同一个线程中初始化并调用算法,所以我检查了 LockOSThread使用1个线程,但我的服务器拥有4个GPU 在C/C++中,我可以创建4个线程,在每个线程中初始化算法,使用sem\u wait和sem\u post分配任务,1个线程使用1个GPU 如何在Go中执行相同的操作,如何将代码与线程绑定?如果生成了一些goroutine,请在每个goroutine中运行runtime.

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

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

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

如何在
Go
中执行相同的操作,如何将代码与线程绑定?

如果生成了一些goroutine,请在每个goroutine中运行
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
}
类型任务结构{
数据类型到内容识别任务

结果:Go中没有“线程”,因此您无法执行此操作。但您可以使用LockOSThread将4个goroutine锁定到一个线程(希望是4个不同的线程)。@Volker LockOSThread防止任何其他goroutine使用同一线程,因此您可以保证它们位于四个不同的线程上。