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相关推荐

  1. Gox语言中使用Sciter库进行GUI图形界面编程-GX23.1

    Sciter是非常优秀的跨平台GUI图形界面编程库,只需附带一个动态链接库文件,就可以实现基于HTML/CSS/TiScript的图形界面,并且已经经过很多公司和商用产品的实际检验,稳定可靠.我们常见 ...

  2. Gox语言中的基本数据类型及其转换-GX5.1

    Gox语言默认选用Qlang语法引擎,Qlang脚本语言又是基于Go语言(Golang)做了一定的改进,数据类型基本继承自Go语言,数据的赋值等操作也基本类似但略加改进和变化.一个主要的不同是,Gox ...

  3. Gox语言中的循环与分支-GX14

    Gox语言中实现的循环与分支都是比较简单,也比较好理解的.唯一需要注意的是else if需要写作"elif",其他的基本与Go语言类似. 下面引自Qlang的Github页面, f ...

  4. Gox语言中的结构类型-GX10.1

    Gox语言中,结构类型(struct)其实并不是很常用,因为Gox语言本身就是动态类型的语言,一般的类似结构体的数据直接用数组或者映射类型就可以了,里面的数据项可以是任意类型,包括嵌套复合类型.对映射 ...

  5. Gox语言中的运算符和操作符-GX13

    Gox语言中的运算符和操作符还是比较简单的, // Assignment a = nil println(a) a = true println(a)println("-----" ...

  6. Gox语言中的函数类型-GX9.1

    函数类型是一种特殊的数据类型,表示计算机语言中可以被调用的函数. 在Gox语言中,函数类型是这样定义的. myAdd = fn(a, b) {return a + b + b }c = myAdd(3 ...

  7. Gox语言中如何处理XML-GX20

    Gox语言中集成了Go语言的第三方库etree,因此已经内置XML文档的处理功能.etree更详细的文档可参考这里. 我们直接来看下面这个例子: etree = github_beevik_etree ...

  8. Gox语言中的数组类型及其常用操作 - GX7.1

    作为脚本语言,Gox语言中的复合类型当然会设计得更加方便一些,也很容易理解.由于Gox默认使用Qlang脚本引擎,Qlang中关于数组或者叫做切片(也就是Go语言中的slice,以后我们约定这两个称呼 ...

  9. Gox语言中进行屏幕截图并显示在Sciter图形界面中-GX38.2

    本例承接GX38.1一文中的例子,加了一些改进,在进行界面截图后,将图片展示在用Sciter包编写的图形界面上. 代码如下: // 设置github.com/kbinani/screenshot包的简 ...

最新文章

  1. mac 需要修复你的资源库才能运行应用软件
  2. idm 服务器响应显示您没有权限下载此文件_仅需10分钟,让你掌握下载神器IDM的使用技巧...
  3. 一个MVP+RxJava+Retrofit的干货集中营
  4. 十天学会PHP(第五版),十天学会php之第五天
  5. P2转P3'dict' object has no attribute 'has_key'
  6. dp之多重背包poj2392
  7. sis最新ip地址2020_2020年12月版 最新IP数据库 号段归属地 省市区镇村行政区划
  8. maven如何实现创建带源代码的jar包
  9. SpringMVC4 实例
  10. oracle 表或视图不存在
  11. 软件测试之软件测试方法
  12. 网站接入qq客服在线聊天
  13. Winrar去广告图文教程
  14. 0x000000c5(0X000000C5蓝屏是什么意思)
  15. SQL考试练习题及全部答案3
  16. C#:BackgroundWorker的简单使用
  17. 考研用什么蓝牙降噪耳机好?适合学生党的降噪耳机推荐
  18. PDE优化|逆问题中偏微分方程约束优化的惩罚方法(Matlab代码实现)
  19. laragon yii
  20. 【友盟+】国庆假期旅游类APP使用报告(下)

热门文章

  1. 在c语言中i10是什么意思啊,跪求!!!高手们帮忙
  2. excel如何将多行多列变成一列
  3. PM进阶之路 | 用户端产品设计
  4. 免费使用的在线Axure原型工具找到了!
  5. 17天 GRE单词——实践日志(更新中)
  6. 帆软的数知鸟是一个什么东西
  7. 爬虫练习(一)爬取Boss直聘的招聘信息
  8. 简易Lasso回归 R语言 变量含有分类变量处理
  9. “派菲斯”大门出入口控制系统方案
  10. 项目实战典型案例11——生产环境重大事故