Processamento simultâneo na linguagem Gox e usando canais para realizar o compartilhamento de segurança de dados-GX21

Na linguagem Gox, ele basicamente herda o mecanismo de simultaneidade da linguagem Go e o tipo de canal chan usado para operações de compartilhamento de segurança de dados.

Em relação ao uso do tipo de canal, primeiro olhe as instruções em Qlang.

tipo chan

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

Semelhante à linguagem Go, chan tem as seguintes operações integradas:

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

Deve-se notar que depois que chan é fechado, <-ch obtém o valor indefinido. Portanto, deve ser assim no qlang:

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

O uso mais detalhado é mostrado no exemplo a seguir:

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")
}

Neste trecho de código, são criados 3 Goroutines, que podem ser entendidos como 3 threads.Os primeiros dois threads gravam dados no canal a cada segundo e o terceiro thread grava dados do canal a cada 500 milissegundos. Leia os dados e exiba-os. Além disso, não devemos esquecer o encadeamento principal, o encadeamento principal deve sempre existir, caso contrário, todos os encadeamentos filhos sairão com o fim do encadeamento principal. Portanto, temos um loop infinito em nossa thread principal, gerando informações a cada 5 segundos.

Observe também que os três Goroutines são executados com go mais uma função anônima. O uso de go é o mesmo que na linguagem Go, e outras funções também podem ser iniciadas como threads.

Você pode usar Ctrl-C para sair do programa e o resultado de toda a execução do código é semelhante ao seguinte (ele se repetirá indefinidamente até que você pressione Ctrl-C para encerrar):

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

 


 

* Observação: desde a versão 0.988, a fim de reduzir o tamanho desnecessário do arquivo, Gox abandonou outros mecanismos de script e só oferece suporte ao mecanismo Qlang, então o conteúdo a seguir não é mais válido e está reservado apenas para referência à versão antiga.

E o seguinte é o uso da versão do motor Anko, que é semelhante.

Em primeiro lugar, é muito conveniente que qualquer função possa ser iniciada como um thread com a palavra-chave go; então o canal pode ser definido como make (chan string), o chamado canal na linguagem Go é a segurança de simultaneidade para compartilhar dados Para tipos de dados específicos, consulte a documentação oficial do idioma Go para uso específico.

O uso mais detalhado é mostrado no exemplo a seguir:

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")
}

Neste trecho de código, são criados 3 Goroutines, que podem ser entendidos como 3 threads.Os primeiros dois threads gravam dados no canal a cada segundo e o terceiro thread grava dados do canal a cada 500 milissegundos. Leia os dados e exiba-os. Além disso, não devemos esquecer o encadeamento principal, o encadeamento principal deve sempre existir, caso contrário, todos os encadeamentos filhos sairão com o fim do encadeamento principal. Portanto, temos um loop infinito em nossa thread principal, gerando informações a cada 5 segundos.

Você pode usar Ctrl-C para sair do programa e o resultado de toda a execução do código é semelhante ao seguinte (ele se repetirá indefinidamente até que você pressione Ctrl-C para encerrar):

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

Acho que você gosta

Origin blog.csdn.net/weixin_41462458/article/details/108573200
Recomendado
Clasificación