Gox言語での並行処理とチャネルを使用したデータセキュリティ共有の実現-GX21

Gox言語では、基本的にGo言語の同時実行メカニズムと、データセキュリティ共有操作に使用されるチャネルタイプchanを継承します。

chan型の使用については、まずQlangの説明をご覧ください。

ちゃんタイプ

ch1 = make(chan bool, 2) // 得到 buffer = 2 的 chan bool
ch2 = make(chan int) // 得到 buffer = 0 的 chan int
ch3 = make(chan map[string]int) // 得到 buffer = 0 的 chan map[string]int

Go言語と同様に、chanには次の組み込み演算があります。

n = len(ch1) // 取得chan当前的元素个数
m = cap(ch1) // 取得chan的容量
ch1 <- true // 向chan发送一个值
v = <-ch1 // 从chan取出一个值
close(ch1) // 关闭chan,被关闭的chan是不能写,但是还可以读(直到已经写入的值全部被取完为止)

chanが閉じられた後、<-chは未定義の値を取得することに注意してください。したがって、qlangでは次のようになります。

v = <-ch1
if v != undefined { // 判断chan没有被关闭的逻辑
	...
}

より詳細な使用法を次の例に示します。

c = make(chan int)

go fn() {
	for {
		c <- 1
		tk.SleepSeconds(1)
	}
}()

go fn() {
	for {
		c <- 200
		tk.SleepSeconds(1)
	}
}()

go fn() {
	for {
		tmp = <-c
		println(tmp)
		tk.SleepMilliSeconds(500)
	}
}()

for {
	tk.SleepSeconds(5)

	println("main thread")
}

このコードでは、3つのGoroutineが作成され、3つのスレッドとして理解できます。最初の2つのスレッドは1秒ごとにチャネルにデータを書き込み、3番目のスレッドは500ミリ秒ごとにチャネルからデータを書き込みます。データを読み取って表示します。さらに、メインスレッドを忘れてはなりません。メインスレッドは常に存在している必要があります。そうでない場合、子スレッドはすべてメインスレッドの終わりで終了します。したがって、メインスレッドに無限ループがあり、5秒ごとに情報が出力されます。

また、3つのGoroutineはすべてgoと無名関数で実行されることに注意してください。goの使用方法はGo言語と同じで、他の関数もスレッドとして開始できます。

Ctrl-Cを使用してプログラムを終了すると、コード全体の実行結果は次のようになります(Ctrl-Cを押して終了するまで無限に繰り返されます)。

λ gox chan.gox
1             
200           
1             
200           
1             
200           
1             
200           
1             
200           
main thread   
1             
200           
1             
200           

 


 

*注:バージョン0.988以降、不必要なファイルサイズを減らすために、Goxは他のスクリプトエンジンを廃止し、Qlangエンジンのみをサポートしているため、次のコンテンツは無効になり、古いバージョンへの参照用にのみ予約されています。

そして以下は同様のAnkoエンジン版の使い方です。

まず第一に、任意の関数をgoキーワードを使用してスレッドとして開始できることは非常に便利です。チャネルはmake(chan文字列)などの方法で定義できます.Go言語のいわゆるチャネルは、データを共有するための同時実行の安全性です特定のデータ型については、特定の使用法についてGo言語の公式ドキュメントを参照してください。

より詳細な使用法を次の例に示します。

tk = import("tk")

c = make(chan int64)

go func() {
	for {
		c <- 1
		tk.SleepSeconds(1)
	}
}()

go func() {
	for {
		c <- 200
		tk.SleepSeconds(1)
	}
}()

go func() {
	for {
		tmp = <-c
		println(tmp)
		tk.SleepMilliSeconds(500)
	}
}()

for {
	tk.SleepSeconds(5)

	println("main thread")
}

このコードでは、3つのGoroutineが作成され、3つのスレッドとして理解できます。最初の2つのスレッドは1秒ごとにチャネルにデータを書き込み、3番目のスレッドは500ミリ秒ごとにチャネルからデータを書き込みます。データを読み取って表示します。さらに、メインスレッドを忘れてはなりません。メインスレッドは常に存在している必要があります。そうでない場合、子スレッドはすべてメインスレッドの終わりで終了します。したがって、メインスレッドに無限ループがあり、5秒ごとに情報が出力されます。

Ctrl-Cを使用してプログラムを終了すると、コード全体の実行結果は次のようになります(Ctrl-Cを押して終了するまで無限に繰り返されます)。

λ gox scripts\chan.gox            
1                                 
200                               
1                                 
200                               
1                                 
200                               
1                                 
200                               
1                                 
200                               
main thread                       
1                                 
200                               
1                                 
200                               
1                                 
200                               

おすすめ

転載: blog.csdn.net/weixin_41462458/article/details/108573200