Multithreading golang:如何用线程绑定代码?
我几乎实现了一个人脸识别Go服务器。我的人脸识别算法使用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.
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使用同一线程,因此您可以保证它们位于四个不同的线程上。