go
1package controller 2 3import ( 4 "github.com/gin-gonic/gin" 5 "github.com/sclevine/agouti" 6 "log" 7 "sync" 8) 9 10func chrome() *agouti.Page { 11 agoutiDriver := agouti.ChromeDriver( 12 agouti.ChromeOptions("args", []string{ 13 "--headless", // headlessモードの指定 サイト読み込み時の起動をなくす 14 }), 15 ) 16 agoutiDriver.Start() 17 // defer agoutiDriver.Stop() 18 page, _ := agoutiDriver.NewPage() 19 return page 20} 21 22func DisplayAction(c *gin.Context) { 23 24 wg := &sync.WaitGroup{} 25 26 messages := make([]string, 0, 6) 27 28 test := make(chan []string) 29 30 wg.Add(2) 31 32 go func(){ 33 page := chrome() 34 35 // アイウエオ店 36 page.Navigate("https://www.アイウエオ.co.jp/") 37 title1, _ := page.Title()//アイウエオ 38 39 y := make([]string, 0, len(messages)+2) 40 y = append(y, messages...) 41 y = append(y, title1) 42 43 test <- y 44 45 wg.Done() 46 }() 47 48 go func() { 49 page := chrome() 50 51 // かきくけこ店 52 page.Navigate("https://www.かきくけこ.co.jp/") 53 54 title2, _ := page.Title()//かきくけこ 55 56 a := make([]string, 0, len(messages)+2) 57 a = append(a, messages...) 58 a = append(a, title2) 59 60 test <- a 61 62 wg.Done() 63 }() 64 65 wg.Wait()//これを入れるとここで止まってしまう 66 67 msgs := <-test 68 69 c.HTML(200, "hoge.html", gin.H{ 70 "titles": msgs, 71 72 }) 73}
html
1hoge.html 2 3<!DOCTYPE html> 4<html lang="ja"> 5 <head> 6 <meta charset="UTF-8" /> 7 </head> 8 <body> 9 <ul> 10 <!-- {{define "index"}} --> 11 <br> 12 <h1>{{range .titles}}</h1> 13 <p>{{.}}</p> 14 {{end}} 15 <!-- {{end}} --> 16 </ul> 17 </body> 18</html>
期待する結果
msgs = [{アイウエオ} {かきくけこ}]
現在配列に値を入れようとしてもtitle1またはtitle2のどちらか片方のみmsgsに値が入ってしまいます。 (例)msgs = [アイウエオ]
そこで&sync.WaitGroup{}を使ってgoroutinの処理が終わってから次の処理にいくことで問題を解決できるのではないかと考えたのですが、
wg.Wait()を入れると止まってしまいます。(ずっとロード中)
&sync.WaitGroup{}の使い方でどこかおかしな点はございますでしょうか?
もしくは他にgoroutinで取得したそれぞれの値(title1,title2)をうまく配列にする方法はございますでしょうか?
お力をお借りしたいです。何卒よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/13 21:54
2021/01/16 03:58 編集
2021/01/16 13:24
2021/01/19 07:16