- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
正如“A Tour of Go”的 Crawl 示例中提到的命中,我修改了 Crawl 函数,只是想知道为什么“go Crawl”无法生成另一个线程,因为只找到一个 url 被打印出来。
我的修改有问题吗?
如下列出我的修改,
// Crawl uses fetcher to recursively crawl
// pages starting with url, to a maximum of depth.
func Crawl(url string, depth int, fetcher Fetcher) {
// TODO: Fetch URLs in parallel.
// TODO: Don't fetch the same URL twice.
// This implementation doesn't do either:
if depth <= 0 {
fmt.Printf("depth <= 0 return")
return
}
body, urls, err := fetcher.Fetch(url)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("found: %s %q\n", url, body)
crawled.mux.Lock()
crawled.c[url]++
crawled.mux.Unlock()
for _, u := range urls {
//crawled.mux.Lock()
if cnt, ok := crawled.c[u]; ok {
cnt++
} else {
fmt.Println("go ...", u)
go Crawl(u, depth-1, fetcher)
}
//crawled.mux.Unlock()
//Crawl(u, depth-1, fetcher)
}
return
}
type crawledUrl struct {
c map[string]int
mux sync.Mutex
}
var crawled = crawledUrl{c: make(map[string]int)}
最佳答案
在您的程序中,您的 go 例程没有任何同步工具。
所以这段代码的行为是未定义的。 也许 go 主线程很快就会结束。
请记住,主 go 例程永远不会阻塞以等待其他 go 例程终止,除非您明确使用某种 util 来同步 go 例程的执行。
例如 channel 或有用的同步工具。
我帮忙给个版本
type fetchState struct {
mu sync.Mutex
fetched map[string]bool
}
func (f *fetchState) CheckAndMark(url string) bool {
defer f.mu.Unlock()
f.mu.Lock()
if f.fetched[url] {
return true
}
f.fetched[url] = true
return false
}
func mkFetchState() *fetchState {
f := &fetchState{}
f.fetched = make(map[string]bool)
return f
}
func CrawlConcurrentMutex(url string, fetcher Fetcher, f *fetchState) {
if f.CheckAndMark(url) {
return
}
body, urls, err := fetcher.Fetch(url)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("found: %s %q\n", url, body)
var done sync.WaitGroup
for _, u := range urls {
done.Add(1)
go func(u string) {
defer done.Done()
CrawlConcurrentMutex(u, fetcher, f)
}(u) // Without the u argument there is a race
}
done.Wait()
return
}
请注意sync.WaitGroup的使用,引用doc你可以了解整个故事。
关于 'A Tour of Go'的Crawl例子goroutine没有生效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46386163/
go版本go1.12.9 darwin/amd64 安装 golang.org/x/tour 软件包后,我运行命令 tour 并收到错误: Couldn't find tour files: coul
使用 bootstrap-tour 插件 ( http://bootstraptour.com/ ),我想在除最后一步之外的每个步骤上禁用或隐藏默认的“End Tour”按钮。 我尝试修改步骤模板以完
我正在尝试使用 Bootstrap 主题在 Wordpress 网站上实现 Bootstrap Tour,但到目前为止,每次我尝试链接样式表 (CSS) 和 JavaScrit 时,它都不起作用。该页
正如“A Tour of Go”的 Crawl 示例中提到的命中,我修改了 Crawl 函数,只是想知道为什么“go Crawl”无法生成另一个线程,因为只找到一个 url 被打印出来。 我的修改有问
HTML: button JS: var tour = new Tour({ steps: [{ element: "#enrol-btn1", title: "Exam Enrolm
我正在尝试使用 vue-tour,按照指南中的确切步骤我收到了这个错误 https://github.com/pulsardev/vue-tour 步骤 在 main.js 上添加 vue-tour
我正在尝试使用DFS制作程序骑士之旅,但我无法解决这个程序..因为我总是有这样的消息错误 线程“AWT-EventQueue-0”中的异常java.lang.ArrayIndexOutOfBounds
我真的可以使用帮助来关闭我正在构建的网页的 Bootstrap Tour 插件的“自动启动”功能。这次旅行本身效果很好。它按照预期从一步跳到另一步。但是,当用户第一次查看页面时,导览会自行开始。用户可
我正在使用 Bootstrap 游览,但问题是我只需要游览/突出显示不正确的字段。 Bootstrap 游览的问题在于硬编码所有元素 id 或类名。我遇到的表单错误是基于不正确的字段。因此,我无法对字
我们可以通过获取当前步骤元素 var step = tour._options.steps[tour.getCurrentStep()]; var element=$(step.element); 与
我一直在尝试使用“Bootstrap Tour”在我的网站上安装一个导览,我对 Javascript 和一般编码还很陌生,而且我已经做了一整天。我想我会来这里问更有经验的人。 hi1 有时会起作用,但
我对 Bootstrap tour 有疑问. 我的问题 当我从一个页面重定向到另一个页面时,init 函数将被调用,但不会自动继续浏览。所以 Bootstrap 之旅不会显示。该页面还包含一个 AJA
我在这里发帖是因为我无法在 Boostrap Tour 的官方文档或此处的任何其他主题中找到解决我的问题的方法。 这是我的问题:我有一个页面,我想在其中初始化两个游览,以便让我的用户选择从哪一个开始。
我通过我的网站进行了游览。我希望用户在结束游览后可以通过单击按钮手动开始游览。 按钮: Start Tour Bootstrap 游览脚本。 var tour = new Tour(); tour
我正在尝试突出显示表格行。即使有了针对 z-indexes 等的 Bootstrap 修复 github issue link 看看这个 fiddle :jsFiddle JavaScript $("
我在我的网站“Drupal 8”上安装了下一个模块“D8:Bootstrap Tour”,它使用主题“Bootstrap 3”。 https://www.drupal.org/project/bs_t
以下是我的引用代码: 我正在为我的应用程序使用 Bootstrap 游览。 要求: 当我点击“下一步”时,我处于第一步,然后它正在检查“#id2”的值。如果 id2 值不为空,则应跳过该步骤并直接进入
我已经在我的项目中实现了 Bootstrap 之旅。我尝试将其加载到模态窗口上,但没有显示任何内容。下面是我的代码: $(document).ready(function (
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 8 年前。
我正在玩 Bootstrap Tour,我发现自己卡在了导航页面上。 在我的导览中,第四步将用户从 index.cshtml 带到 page.cshtml,这工作正常,但是导览框不会在 page.cs
我是一名优秀的程序员,十分优秀!