(Go言語・WebAssembly)Webページで並列処理はできるのか?
前書き
Go言語を勉強する中でgoルーチンを使ってWebAsseblyにコンパイルした場合、
ブラウザ上で並列処理はきちんと行っているのか気になったので確認しました。
結果
以降はソースコードの記述です。
コンパイルの方法などは以前の記事を参照してください。
(Go言語)WebAssemblyで簡単なWebサイトを作ってみた
実行環境
OS:Windows 10 64bit
言語環境:go version go1.14.1
ブラウザ:Firefox バージョン: 74.0
ソースコード
該当部分のみ抜粋
<body>
<button type="submit" id="button1" >START</button><br>
<div id="time1" >時刻1:</div>
<div id="time2" >時刻2:</div>
<div id="time3" >時刻3:</div>
</body>
func Get_time() string {
now := time.Now()
str := strconv.Itoa(now.Hour()) + ":" + strconv.Itoa(now.Minute()) + ":" + strconv.Itoa(now.Second())
return str
}
package main
import (
"strconv"
"syscall/js"
"time"
)
func main() {
//イベントの管理-
get_three_time("button1", "time1", "time2", "time3")
<-make(chan struct{}, 0)
}
func get_three_time(id string, output1 string, output2 string, output3 string) {
//idから対象のオブジェクトを取得
object := js.Global().Get("document").Call("getElementById", id)
out1 := js.Global().Get("document").Call("getElementById", output1)
out2 := js.Global().Get("document").Call("getElementById", output2)
out3 := js.Global().Get("document").Call("getElementById", output3)
//ゴールーチンで実行し
action := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
go func() {
time.Sleep(time.Duration(0) * time.Second)//0秒待機
out1.Set("innerText", "時刻1:"+Get_time())
}()
go func() {
time.Sleep(time.Duration(2) * time.Second)//2秒待機
out2.Set("innerText", "時刻2:"+Get_time())
}()
go func() {
time.Sleep(time.Duration(4) * time.Second)//4秒待機
out3.Set("innerText", "時刻3:"+Get_time())
}()
return nil
})
//アクションの呼び出し
object.Call("addEventListener", "click", action)
}
結果・感想
Go言語+WebassemblyでGoルーチンによる並列処理を実装してみました。
もともとJavascritpには同期/非同期処理があり、それらと動作の違いはないかもしれません。
CPU視点で見れば、マルチスレッドによる非同期処理が役に立つ場面が存在しますが、
はたしてブラウザ上のバイナリコードが、複数のコア上で動作するのか?
という疑問が残ります。
仮説ですが、
スクリプトの実行がブラウザの1プロセス上として動作するならマルチスレッドとはなりませんし、ブラウザやCPUアーキテクチャに依存する可能性があります。
しかしながら、ソースコードで並列処理を実装できることはGo言語のメリットです。
フロントエンドにJavascriptやPHPなくGo言語を採用する理由の一つになるのではないでしょうか。
次はGo言語でAPIサーバを構築して、それをもとにSPAなwebページの構築を目指しています。
できる限りGo言語でWEBシステムを構築してくために少しづつですが前に進んでいる実感があります。
これからも頑張っていこうと思います。
ここまで読んできただきありがとうございました。
Author And Source
この問題について((Go言語・WebAssembly)Webページで並列処理はできるのか?), 我々は、より多くの情報をここで見つけました https://qiita.com/daemonkimura/items/d37f506f0cc012c5ba7c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .