- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么下面的代码会出现死锁?我正在尝试将 goroutine 中的某些内容返回到外部
package main
import (
"fmt"
"syscall/js"
"time"
)
func test(this js.Value, i []js.Value) interface{} {
done := make(chan string, 1)
go func() {
doRequest := func(this js.Value, i []js.Value) interface{} {
time.Sleep(time.Second)
return 0
}
js.Global().Set("doRequest", js.FuncOf(doRequest))
args := []js.Value{js.ValueOf("url")}
var x js.Value
doRequest(x, args)
done <- "true"
}()
aa := <-done
fmt.Println(aa)
return 0
}
func main() {
c := make(chan bool)
js.Global().Set("test", js.FuncOf(test))
<-c
}
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
.....
最佳答案
几乎就是它在错误消息中所说的内容。所有的 goroutine 都处于休眠状态。 main
不启动任何东西,只是接收一个 channel ,所以它被阻塞了,并且没有其他 goroutines 正在运行,所以不可能 main
可能会再次唤醒,因此运行时会出现 panic 。
如果我没记错的话,与常规 Go 不同,如果 main
,GopherJS 不会关闭所有内容并退出。退出(部分原因是:这到底意味着什么?最接近 Go 程序的模拟是关闭网页!这有点糟糕。所以 GopherJS 不会那样做。)。所以你在做什么来保持main
严格来说,在 GopherJS 中,活着不是必需的。
也就是说,如果你说(例如)time.Sleep(time.Hour)
最后,当所有的 goroutine 都还在休眠时(严格来说),main
最终会唤醒,运行时知道,所以在这种情况下它不会 panic 。
至于你的实际test
功能,一旦你尝试了,你会得到一个相关的错误信息:Uncaught Error: runtime error: cannot block in JavaScript callback, fix by wrapping code in goroutine
. test
在 channel 上进行阻塞调用,而 GopherJS 不允许在直接从 Javascript 调用的函数中执行此操作,因此它会发生 panic 。 (当我在 playground 中运行它时,我也会得到 Uncaught TypeError: r is not a function
,但这只是早期错误的后果。)
我想你要做的是等待doRequest
完成,打印值并返回,但这不起作用。为此,您需要使用 native Javascript promise 或其他一些异步机制。
关于go - GopherJS 在 goroutine 中的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60208819/
我目前正在尝试使用 websockets 进行通信,我的代码如下(我使用的是 gorilla ) buff := bytes.NewBuffer([]byte{}) binary.Write(buff
为什么下面的代码会出现死锁?我正在尝试将 goroutine 中的某些内容返回到外部 package main import ( "fmt" "syscall/js" "tim
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 5 年前。 Improve
在运行 gopherjs test 时,是否有一种简单的方法来包含 jquery.js 以用于测试和被测代码? 我目前正在从我的 index.html 中的 CDN 加载 jquery,但如果允许我包
我用 Go 编写了一个简单的包,并使用 gopherJS 进行了编译。 然后我通过 将它包含在我的 HTML 中 已加载,一切正常。但是我不确定如何重用在我自己的 javascript 中的一个包中
我正在尝试使用 GopherJS,但找不到有关如何使用它的文档。 这是 Go 代码: package main import ( "github.com/gopherjs/gopherjs/j
我是一名优秀的程序员,十分优秀!