ballerina 学习十七 多线程编程
并发&&多线程开发对于日常的处理是比较重要的,ballerina 支持的模式有work fork/join async lock
基本workers
- 参考代码
import ballerina/io;
function main(string… args) {
worker first {
io:println("first");
}
worker second {
io:println("second");
}
}- 输出结果
first
secondworkers 数据通信
worker 之间的通信和大部分语言都是比较类似的消息,同时使用channel(类似golang),同发送,接收应该是成对出现
- 参考代码
import ballerina/io;
function main (string… args) {
worker first {
string name ="from first message";
name -> second;
io:println("send message first-> second ");
}
worker second {
string name ;
name <- first;
io:println("recevied message first ",name);
}
}
- 输出结果
recevied message first from first message
send message first-> second基本fork/join
类似java 语言的多线程开发模型
- 参考代码
import ballerina/io;
function main (string… args) {
fork {
worker first {
"dalongdemo first" -> fork;
}
worker second {
(1,"appdemo") -> fork;
}
} join (all) (map results) {
int index ;
string indexname;
string first = <string>results["first"];
io:println(first," result from first work");
(index, indexname) = check <(int, string)>results["second"];
io:println(index,indexname, " result from second work");
}
}
- 输出结果
dalongdemo first result from first work
1appdemo result from second workfork/join 条件
上面的例子我们使用的是all 实际上可以使用some
import ballerina/io;
import ballerina/runtime;
function main(string… args) {
fork {
worker w1 {
int i = 23;
string s = "Colombo";
io:println("[w1] i: ", i, " s: ", s);
runtime:sleep(100);
(i, s) -> fork;
}
worker w2 {
float f = 10.344;
io:println("[w2] f: ", f);
runtime:sleep(100);
f -> fork;
}
} join (some 1) (map results) {
if (results["w1"] != null) {
int iW1;
string sW1;
(iW1, sW1) = check <(int, string)>results["w1"];
io:println("[join-block] iW1: ", iW1, " sW1: ", sW1);
}
if (results["w2"] != null) {
float fW2 = check <float>results["w2"];
io:println("[join-block] fW2: ", fW2);
}
}
}
- 输出结果
[w1] i: 23 s: Colombo
[w2] f: 10.344
[join-block] iW1: 23 sW1: Colombo
[join-block] fW2: 10.344fork/join 变量访问
实际上就是共享数据访问的处理
import ballerina/io;
function main(string… args) {
int i = 100;
string s = "WSO2";
map m = { "name": "dalong", "era": "demoapp" }; string name = <string>m["name"];
string era = <string>m["era"];
io:println("[default worker] before fork-join: value of name is [",
name, "] value of era is [", era, "]");
fork {
worker W1 {
i = 23;
m["name"] = "fengliang";
string n = "Colombo";
(i, n) -> fork;
}
worker W2 {
s = "Ballerina";
m["era"] = "rong";
s -> fork;
}
} join (all) (map results) {
int p;
string l;
(p, l) = check <(int, string)>results["W1"];
string q = <string>results["W2"];
io:println("[default worker] within join: " +
"value of integer variable from W1 is [", p, "]");
io:println("[default worker] within join: " +
"value of string variable from W1 is [", l, "]");
io:println("[default worker] within join: " +
"value of string variable from W2 is [", q, "]");
}
io:println("[default worker] after fork-join: " +
"value of integer variable is [", i, "] ",
"value of string variable is [", s, "]");
name = <string>m["name"];
era = <string>m["era"]; io:println("[default worker] after fork-join: " +
"value of name is [", name,
"] value of era is [", era, "]");
}
- 输出结果
[default worker] before fork-join: value of name is [dalong] value of era is [demoapp]
[default worker] within join: value of integer variable from W1 is [23]
[default worker] within join: value of string variable from W1 is [Colombo]
[default worker] within join: value of string variable from W2 is [Ballerina]
[default worker] after fork-join: value of integer variable is [100] value of string variable is [WSO2]
[default worker] after fork-join: value of name is [fengliang] value of era is [rong]aysnc
- 参考代码
import ballerina/io;
function main (string… args) {
future<int> result = start add(1,3);
int waitresult = await result;
int waitresult2 = getresult(result);
io:println(waitresult," with await");
io:println(waitresult2," with await app");
}
function getresult (future<int> f) returns int{
return await f;
}
function add (int a ,int b) returns int{
return a+b;
}
- 输出结果
4 with await
4 with await applock
类似多线程开发中的锁
- 参考代码
import ballerina/io;
int counter;
function main(string… args) {
process();
io:println("final counter value - ", counter);
}
function process() {
worker w1 {
foreach i in [1..1000] {
lock {
counter = counter + 1;
}
}
}
worker w2 {
foreach i in [1..1000] {
lock {
counter = counter + 1;
}
}
}
worker w3 {
foreach i in [1..1000] {
lock {
counter = counter + 1;
}
}
}
worker w4 {
foreach i in [1..1000] {
lock {
counter = counter + 1;
}
}
}
}
- 输出结果
final counter value - 4000参考资料
https://ballerina.io/philosophy/ 
https://ballerina.io/learn/by-example/async.html 
https://ballerina.io/learn/by-example/locks.html 
https://ballerina.io/learn/by-example/workers.html 
https://ballerina.io/learn/by-example/worker-interaction.html 
https://ballerina.io/learn/by-example/fork-join.html
ballerina 学习十七 多线程编程的更多相关文章
- Linux学习 :多线程编程
		1.Linux进程与线程() 进程:通过fork创建子进程与创建线程之间是有区别的:fork创建出该进程的一份拷贝,创建时额外申请了新的内存空间以及存储代码段.数据段.BSS段.堆.栈空间, ... 
- 深入学习c++--多线程编程(一)
		1. 简介 2. 线程使用 2.1 demo #include <iostream> #include <thread> #include <future> usi ... 
- APUE学习之多线程编程(三):线程属性、同步属性
		一.线程属性 可以使用pthread_attr_t结构修改线程默认属性,并这些属性和创建的线程练习起来,可以使用pthread_att_init函数初始化pthread_attr_t结构,调 ... 
- APUE学习之多线程编程(二):线程同步
		为了保证临界资源的安全性和可靠性,线程不得不使用锁,同一时间只允许一个或几个线程访问变量.常用的锁有互斥量,读写锁,条件变量 一.互斥量 互斥量是用pthrea ... 
- APUE学习之多线程编程(一):线程的创建和销毁
		一.线程标识 和每个进程都有一个进程ID一样,每个线程也有一个线程ID,线程ID是以pthread_t数据类型来表示的,在Linux中,用无符号长整型表示pthread_t,Solaris ... 
- Linux程序设计学习笔记----多线程编程线程同步机制之相互排斥量(锁)与读写锁
		相互排斥锁通信机制 基本原理 相互排斥锁以排他方式防止共享数据被并发訪问,相互排斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个相互排斥锁逻辑上绑定之后,对该资源的訪问操作例如以下: ... 
- 深入学习c++--多线程编程(三)thread的两种死法
		1. 生成了一个线程,需要告诉编译器是否管理 必须告诉编译器是不管理还是管理,否则直接down了 #include <iostream> #include <thread> # ... 
- 深入学习c++--多线程编程(二)【当线程间需要共享非const资源】
		1. 遇到的问题 #include <iostream> #include <thread> #include <chrono> #include <futu ... 
- 吴裕雄--天生自然 JAVA开发学习:多线程编程
		class RunnableDemo implements Runnable { private Thread t; private String threadName; RunnableDemo( ... 
随机推荐
- git基本配置及使用
			目录 设置git git remote git-flow git merge 与 git rebase 参考 Git是分布式的代码管理工具,远程的代码管理是基于SSH的,所以要使用远程的Git则需要S ... 
- Win32程序支持命令行参数的做法
			作者:朱金灿 来源:http://blog.csdn.net/clever101 首先说说Win 32 API程序如何支持命令行参数.Win 32程序的入口函数为: int APIENTRY _tWi ... 
- openwrt生成的交叉编译器在哪里
			答:在staging_dir目录下,示例如下: 编译一个arm64架构所生成的编译器在staging_dir/toolchain-aarch64_generic_gcc-7.4.0_musl/bin/ ... 
- ZOJ 3541 The Last Puzzle(经典区间dp)
			http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3541 题意:有一排开关,有个开关有两个值t和d,t是按下开关后在t秒后会自 ... 
- C++中的动态绑定
			C++中基类和派生类遵循类型兼容原则:即可用派生类的对象去初始化基类的对象,可用派生类的对象去初始化基类的引用,可用派生类对象的地址去初始化基类对象指针. C++中动态绑定条件发生需要满足2个条件: ... 
- session放数据库里解决丢失的问题
			在编程里是会话的意思Session 对象存储特定用户会话所需的信息.这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去. ... 
- Mac for MySQL 5.7 安装教程
			一.环境 MAC OS X 10.10 二.下载MySQL 地址:http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.10-osx10.10- ... 
- 使用AspNetPager进行分页,查询条件丢失问题
			在Asp.Net中使用AspNetPager进行分页时,发现一个问题: 当通过查询条件进行查询后,对查询结果进行翻页操作时,查询条件会丢失. 当修改UrlPaging属性后(设置UrlPaging=“ ... 
- freemarker多个checkbox一个以上被选中示例
			<tr> <td class="handColumn" colspan="5" > <#list deptHandNotConta ... 
- nyoj1273  河南省第九届省赛_"宣传墙"、状压DP+矩阵幂加速
			宣传墙 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准备在一条道路南 面 4*N 的墙上做 ... 
