2022幎11月07日·1分で読めたす

ゎルアりトラむン

今回は、goキヌワヌドを䜿っお、1぀のゎルヌチンず耇数のゎルヌチンを同時に起動させるプログラムを開発したす。

ゎルアりトラむン

プログラミング蚀語「Go 」の最も人気のある点の1぀は、コンピュヌタが倚くのタスクを同時に達成する胜力を第䞀玚にサポヌトしおいるこずです。コンピュヌタがコヌドの単䞀フロヌをより速く実行するこずから、倚くのストリヌムを同時に実行するこずに移行するに぀れ、コヌドを同時に実行する胜力はプログラミングにおいおより重芁になり぀぀ありたす。より高速に動䜜する プログラムを䜜る ために、プログラマはシステムの各同時実行芁玠が他の芁玠から独立しお実行できるように、同時に実行するように蚭蚈しなければなりたせん。

Go の機胜であるGoroutines ずチャンネルを䞀緒に䜿うず、同時実行が容易になりたす。Goroutines はこの機胜のための基本的な原型を提䟛したす。Goroutines はメモリ空間、スレッド間盞互䜜甚、ネットワヌク接続に関しおコストが䜎くなっおいたす。たた、スレッドよりも起動時間が短く、倚くのプログラミング蚀語でサポヌトされおいたす。芁するに、Go は、Javaや他のプログラミング蚀語がスレッドず呌んでいるものずしお、Goroutines を参照しおいるのです。

Goroutines ずは

ゎルヌチンずは、プログラムの他の郚分ず同時に実行されるGolangの単玔な実装スレッドです。Goroutines 、ゎルヌチンの䜜成コストが非垞に䜎いため、暙準的なスレッドに䌌せるず手頃です。そのため、Go 、䞊行プログラミングに広く採甚されおいたす。すべおのプログラムは、少なくずも1぀のメむンゎルヌチンず呌ばれるゎルヌチンで構成されおいたす。メむンゎルヌチンは他のすべおのゎルヌチンを制埡するため、メむンゎルヌチンが終了するずスクリプト内の他のすべおのゎルヌチンも終了したす。ゎルヌチンは垞にバックグラりンドで動䜜しおいたす。

䟋䟋ノヌトブックに䜕か曞いおいおお腹が空いたので、䞀䌑みしお䜕か食べる。そしおたた曞き始める。あなたは今、兌業ずみなされる時間枠で2぀の圹割曞くこずず食べるこずをしおいたす。ここで泚目すべきは、この2぀の䜜業曞くこずず食べるこずは、やはり同時に完了させる必芁があるこずです。項目が同時に完了するこずを䞊行性ず呌びたすポテトチップスを食べながら携垯電話を䜿うこずを想像しおみおください。同時䞊行には、同時に倚くのものず盞互䜜甚するこずが含たれたす。䞊行性倚くのこずを同時に行うこずは、これのサブクラスで同時に行う必芁はない䜕らかのタむムテヌブルがある。

関数呌び出しにgoキヌワヌドを適甚するこずで、ゎルヌチンを远加するこずができたす。関数呌び出しにgoキヌワヌドを適甚したら、䞊行凊理を性胜に蚭定するこずになる。しかし、その前に、goキヌワヌドを実行に適甚した堎合の効果を確認しおおこう。あるプログラムの䞭に2぀のゎルヌチンがあるずしよう。package main import" ずいうテキストがプログラムの゚ントリになりたす。Go においお、パッケヌゞのmain importは宣蚀的なimport文である。メむンゎルヌチン(first goroutine)は暗黙の了解です。go (f) を実行するず、2番目のゎルヌチン(0)が生成されたす。通垞、私たちの゜フトり゚アは、関数を実行するず、次の行に進む前に䞀次関数内のすべおのコマンドを実行したす。

そのため、ゎルヌチンによっお玠早く凊理を実行し、次のステップに進むこずができたす。その結果、scanlnメ゜ッドが远加されたした。そうしないず、すべおの数倀を衚瀺する前にコヌドが終了しおしたいたす。Goroutines は簡単に䜜成でき、倧量に䜜成するこずができたす。この゜フトを実行するず、ゎルヌチンが同時進行ではなく、逐次的に動䜜しおいるように芋えるこずに気が぀くでしょう。

スレッドに比べたGoroutines の利点

Goroutines コストが安い

Goroutines は、他の凊理に比べおコストが䜎い。マスサむズは数キロバむトで、プログラムの芁求に応じお拡倧・瞮小できる。スタックサむズを定矩しなければならず、氞久的なものであるスレッドずは察照的である。

倚重化されたものがあるGoroutines

オペレヌティングシステムのスレッドには、倚重化されおいるものはほずんどありたせん。数癟のゎルヌチンを持぀プログラムでは、プロセスは1぀だけかもしれたせん。残りのゎルヌチンは新しいオペレヌティング・システム・プロセスに転送されたす。そのプロセス内のいずれかのゎルヌチンが、ナヌザヌの介入を求めおいる時などに、スタックしたずする。ランタむムはこれらをそれぞれ管理し、我々開発者はこれらの埮劙な耇雑さから隔離されながら同時に管理するための明確な APIを䞎えられお いる。

Goroutines チャンネルを䜿ったコミュニケヌション

Goroutines チャネルを䜿っお䌚話する関連するメモリを共有する際に、レヌス状況が発生しないようにするこずを意図しおいる。チャネルは、ゎルヌチンが察話するために䜿甚する導管に䟋えるこずができるかもしれたせん。

チャネルずは

2぀のゎルヌチンはチャネルを介しお盞互に䜜甚し、その動䜜を調敎するこずができたす。本゜フトりェアでは、"ping"ず連続的に衚瀺されたす。チャンネルの圢匏を指定するには、"chan"ずいう接頭語に、チャンネルで䌝送される項目を぀けたす。"この堎合、文字列を提䟛するこずになりたす。チャネルでは、挔算子を甚いおメッセヌゞを送受信したす。"ping" は、"ping" を送信するこずを指したす。

チャネルは、2぀のゎルヌチンの同期を保぀ために䜿甚されたす。ルヌタヌはチャンネルを越えおメッセヌゞを送信しようずする前に、プリンタヌがメッセヌゞを受け入れる準備ができるたで埅ちたす。これをむンヒビションずいいたす。チャネルを䜜成する堎合、make関数に第2パラメヌタを䜿甚するこずができたす。c:= make (chan int, 1)

チャネルの方向

チャネルのフォヌムの向きを定矩し、それを受信たたは送信のいずれかにパラメヌタ化するこずができたす。䟋えばPingerのメ゜ッド蚘号は、このように倉曎するこずができたす。

func pinger(c chan<- string)

Cは今しか送れたせん。cから受信するず、コヌド゚ラヌになりたす。同様に、出力を次のように倉曎するこずもできたす。

func printer(c string -chan)

半チャンネルはこのような制玄がありたせん。送信専甚や受信専甚のチャネルしか受け付けない手続きに察しお、双方向のチャネルを䞎えるこずはできたすが、その逆はできたせん。

ゎルヌチンの䜜り方

ゎルヌチンの起動方法は簡単です。関数呌び出しに "go" キヌワヌドを適甚しお、同時実行するゎルヌチンを䜜りたす。ここでは、ゎルヌチンを䜜るこずにしたす。䟋えば、りェルカム関数ずメむン関数の2぀の関数からなるプログラムがあるずしたす。

新しいゎルヌチンを䜜るず、welcome()のコヌドはmain()関数ず䞊行しお実行されたす。このプログラムを実行するず、驚かれるこずでしょう。このプログラムは単にmainの動䜜テキストを衚瀺しおいるだけです。最初に起動したゎルヌチンや新しいゎルヌチンはどうなったのでしょうかその理由を理解するためには、たず、ゎルヌチンの2倧特城を知る必芁がありたす。

  • ゎルヌチン関数は、新しいゎルヌチンを䜜るず即座に反応する。関数は別ずしお、管理偎はゎルヌチンに䟝存しないので、ゎルヌチンの実行が完了するのを埅぀こずはない。実行は、ゎルヌチン関数の次のコヌドブロックに枡されたす。このため、ゎルヌチンから䞎えられたパラメヌタは無芖されたす。
  • 䜙分なゎルヌチンは、䞻ゎルヌチンず同時に実行されるべきです。もし、䞻ゎルヌチンが倱敗したら、プログラムは終了し、远加のゎルヌチンは実行されたせん。

これで、今回のコヌドがうたくいかなかった理由がわかったず思いたす。go welcome() の呌び出しに続いお、hello ゎルヌチンの完了を埅぀前に次のコヌド行に制埡が移され、main 関数が出力されたした。実行するスクリプトがないため、mainゎルヌチンが死亡し、helloゎルヌチンの実行を劚げた。

スリヌプ技法(time.sleep(1 * time.second))を発動しお、ゎルヌチンを1秒間停止させたした。これで、goelcome()する関数は、メむンゎルヌチンが終了する前に十分な時間を確保するこずができたした。この゜フトは、最初に"welcome goroutine"を曞き、1秒埅っおからmain関数を衚瀺したす。䞻ゎルヌチンのスリヌプ技法を䜿っお、他のゎルヌチンが完了するたでの間、䞀時停止しおいるのです。

耇数䜜成するGoroutines

思い通りにデプロむ
準備ができたらAppMaster Cloudたたはご自身のクラりドぞデプロむできたす。
アプリをデプロむ

耇数のゎルヌチンを䜜成するために、別のプログラムを起動するこずにしたす。たず、䞊列に実行される2぀のゎルヌチンを䜜成するこずから始めたす。この2぀のゎルヌチンは数字ゎルヌチン[go numbers()]ずアルファベットゎルヌチン[go alphabets () ]です。

数字ゎルヌチンは1を出力する前に250ms滞圚し、2を出力する前に再び䌑憩し、5を出力するたで続けたす。同様に、英数字ゎルヌチンは、aからeたでの文字を衚瀺した埌、400ミリ秒埅ちたす。最埌に、䞻ゎルヌチンが敎数ず英数字を䜜成し、䞀回䌑止した埌、䞻ゎルヌチンが終了する。

䞊行プログラミングのよくある間違い

  • これが必芁なずきに同期を取らないこず
  • 時間を䜿う。同期をずるためにSleepコヌルを䜿う
  • 暙準的な同期パッケヌゞの型のコピヌ倀をゎルヌチンがぶら䞋がったたたにする
  • 同期を呌び出す
  • 埅機グルヌプ
  • 間違った堎所にメ゜ッドを远加する
  • チャンネルは最埌の関数送信者ゎルヌチンからではなく、明日のクロヌズチャンネルずしお䜿甚したす。

たずめ

芖芚的にデヌタベヌスを蚭蚈
Data DesignerのPostgreSQLモデリングを䜿い、初日からしっかりした基盀を築きたす。
プロゞェクトを開始

今回は、go キヌワヌドを䜿甚しお、1 ぀のゎルヌチンず耇数のゎルヌチンを起動し、同時に敎数を出力するプログラムを開発したした。プログラムを起動した埌、新しいチャネルを確立し、そのチャネルを䜿っおあるゎルヌチンで数倀を生成し、別のゎルヌチンに枡しお画面に衚瀺するこずができたした。マルチコアシステムでアプリケヌションを高速化するためのゎルヌチンの起動方法の最埌のデモンストレヌションずしお、同時に倚くの「印刷」ゎルヌチンを起動したした。

ご存知のように、ゎルヌチンはタスクをより速く、効率的に実行するための方法です。これは、AppMaster が提䟛する、アプリケヌションの機胜性を向䞊させるための展開手順の1぀です。AppMaster を䜿えば、プログラミングの知識がほずんどない人でも、マニュアル・コヌディングでは困難な䜜業を完了させるこずができたす。

AppMaster は no-code は、 モバむルやりェブアプリケヌション、バック゚ンドを 䜜成 するこずができるプラットフォヌムです。興味深いこずに、AppMaster は、Go によっおバック゚ンドを毎秒22,000行で䜜成し、゜ヌスコヌドにアクセスするこずができたす。

始めやすい
䜕かを䜜成する 玠晎らしい

無料プランで AppMaster を詊しおみおください。
準備が敎ったら、適切なサブスクリプションを遞択できたす。

始める
ゎルアりトラむン | AppMaster