Gox语言中的并发处理以及用通道实现数据安全共享-GX21
Gox语言中,基本完全继承了Go语言的并发机制和用于数据安全共享操作的通道类型chan。
关于chan类型的使用先看看Qlang中的使用说明,
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
和 Go 语言类似,chan 有如下内置的操作:
n = len(ch1) // 取得chan当前的元素个数
m = cap(ch1) // 取得chan的容量
ch1 <- true // 向chan发送一个值
v = <-ch1 // 从chan取出一个值
close(ch1) // 关闭chan,被关闭的chan是不能写,但是还可以读(直到已经写入的值全部被取完为止)
需要注意的是,在 chan 被关闭后,<-ch 取得 undefined 值。所以在 qlang 中应该这样:
v = <-ch1
if v != undefined { // 判断chan没有被关闭的逻辑...
}
更详细一些的用法如下面的例子所示:
c = make(chan int)go fn() {for {c <- 1tk.SleepSeconds(1)}
}()go fn() {for {c <- 200tk.SleepSeconds(1)}
}()go fn() {for {tmp = <-cprintln(tmp)tk.SleepMilliSeconds(500)}
}()for {tk.SleepSeconds(5)println("main thread")
}
这一段代码中,创建了3个Goroutine,可以理解为3个线程,其中前两个线程是每隔一秒钟向通道中写入一个数据,第三个线程则是每隔500毫秒从通道中读取一个数据并显示出来。另外,我们不要忘了主线程,主线程必须保持始终存在,否则子线程将会随着主线程的结束而全部退出。因此,我们主线程中进行了一个无限循环,每隔5秒钟输出一下信息。
另外注意,三个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 string)这样的方式来进行定义,Go语言中所谓的通道即是用于共享数据的并发安全的特有数据类型,具体的用法可以参考Go语言的官方文档。
更详细一些的用法如下面的例子所示:
tk = import("tk")c = make(chan int64)go func() {for {c <- 1tk.SleepSeconds(1)}
}()go func() {for {c <- 200tk.SleepSeconds(1)}
}()go func() {for {tmp = <-cprintln(tmp)tk.SleepMilliSeconds(500)}
}()for {tk.SleepSeconds(5)println("main thread")
}
这一段代码中,创建了3个Goroutine,可以理解为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
Gox语言中的并发处理以及用通道实现数据安全共享-GX21相关推荐
- Gox语言中使用Sciter库进行GUI图形界面编程-GX23.1
Sciter是非常优秀的跨平台GUI图形界面编程库,只需附带一个动态链接库文件,就可以实现基于HTML/CSS/TiScript的图形界面,并且已经经过很多公司和商用产品的实际检验,稳定可靠.我们常见 ...
- Gox语言中的基本数据类型及其转换-GX5.1
Gox语言默认选用Qlang语法引擎,Qlang脚本语言又是基于Go语言(Golang)做了一定的改进,数据类型基本继承自Go语言,数据的赋值等操作也基本类似但略加改进和变化.一个主要的不同是,Gox ...
- Gox语言中的循环与分支-GX14
Gox语言中实现的循环与分支都是比较简单,也比较好理解的.唯一需要注意的是else if需要写作"elif",其他的基本与Go语言类似. 下面引自Qlang的Github页面, f ...
- Gox语言中的结构类型-GX10.1
Gox语言中,结构类型(struct)其实并不是很常用,因为Gox语言本身就是动态类型的语言,一般的类似结构体的数据直接用数组或者映射类型就可以了,里面的数据项可以是任意类型,包括嵌套复合类型.对映射 ...
- Gox语言中的运算符和操作符-GX13
Gox语言中的运算符和操作符还是比较简单的, // Assignment a = nil println(a) a = true println(a)println("-----" ...
- Gox语言中的函数类型-GX9.1
函数类型是一种特殊的数据类型,表示计算机语言中可以被调用的函数. 在Gox语言中,函数类型是这样定义的. myAdd = fn(a, b) {return a + b + b }c = myAdd(3 ...
- Gox语言中如何处理XML-GX20
Gox语言中集成了Go语言的第三方库etree,因此已经内置XML文档的处理功能.etree更详细的文档可参考这里. 我们直接来看下面这个例子: etree = github_beevik_etree ...
- Gox语言中的数组类型及其常用操作 - GX7.1
作为脚本语言,Gox语言中的复合类型当然会设计得更加方便一些,也很容易理解.由于Gox默认使用Qlang脚本引擎,Qlang中关于数组或者叫做切片(也就是Go语言中的slice,以后我们约定这两个称呼 ...
- Gox语言中进行屏幕截图并显示在Sciter图形界面中-GX38.2
本例承接GX38.1一文中的例子,加了一些改进,在进行界面截图后,将图片展示在用Sciter包编写的图形界面上. 代码如下: // 设置github.com/kbinani/screenshot包的简 ...
最新文章
- mac 需要修复你的资源库才能运行应用软件
- idm 服务器响应显示您没有权限下载此文件_仅需10分钟,让你掌握下载神器IDM的使用技巧...
- 一个MVP+RxJava+Retrofit的干货集中营
- 十天学会PHP(第五版),十天学会php之第五天
- P2转P3'dict' object has no attribute 'has_key'
- dp之多重背包poj2392
- sis最新ip地址2020_2020年12月版 最新IP数据库 号段归属地 省市区镇村行政区划
- maven如何实现创建带源代码的jar包
- SpringMVC4 实例
- oracle 表或视图不存在
- 软件测试之软件测试方法
- 网站接入qq客服在线聊天
- Winrar去广告图文教程
- 0x000000c5(0X000000C5蓝屏是什么意思)
- SQL考试练习题及全部答案3
- C#:BackgroundWorker的简单使用
- 考研用什么蓝牙降噪耳机好?适合学生党的降噪耳机推荐
- PDE优化|逆问题中偏微分方程约束优化的惩罚方法(Matlab代码实现)
- laragon yii
- 【友盟+】国庆假期旅游类APP使用报告(下)