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
second
workers 数据通信
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 work
fork/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.344
fork/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 app
lock
类似多线程开发中的锁
- 参考代码
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( ...
随机推荐
- 2017 Benelux Algorithm Programming Contest (BAPC 17) Solution
A - Amsterdam Distance 题意:极坐标系,给出两个点,求最短距离 思路:只有两种方式,取min 第一种,先走到0点,再走到终点 第二种,走到同一半径,再走过去 #include ...
- zw版【转发·台湾nvp系列Delphi例程】HALCON SqrtImage
zw版[转发·台湾nvp系列Delphi例程]HALCON SqrtImageHALCON SqrtImage 範例 (RAD Studio XE Delphi x64) zw版[转发·台湾nvp系列 ...
- uva1292 树形dp
这题说的是给了一个n个节点的一棵树,然后 你 从 这 棵 树 的 n 个 节点中 选择 尽量少的 点使得 每条边都至少有一个 士兵看守 dp[0][i]+=dp[1][j] dp[1][i]+=min ...
- c# ArrayList 的排序问题!
2009-01-19 20:10 c# ArrayList 的排序问题! c# ArrayList 的排序问题! 我看见网上有人用IComparer接口实现ArrayLIst 的排序问题 ,于是自己写 ...
- Python笔记 #18# Pandas: Grouping
10 Minutes to pandas 引 By “group by” we are referring to a process involving one or more of the foll ...
- c++第二十三天
p124~p126: 算数运算符 1.形如+ -(一元) * / % + -(二元)为算数运算符. 2.所有算数运算符都满足左结合律. 3.算数运算符的运算对象和求值结果都是右值. 4.在表达式求值之 ...
- 20145106 《Java程序设计》第1周学习总结
20145106 <Java程序设计>第1周学习总结 教材学习内容总结 因为我用的是Mac,所以教材内容暂时对我的编译java没有帮助.不过还好我也在同学和自己的帮助学习下初步学会了在Ma ...
- HDU 6053 TrickGCD(莫比乌斯反演)
http://acm.hdu.edu.cn/showproblem.php?pid=6053 题意:给出一个A数组,B数组满足Bi<=Ai. 现在要使得这个B数组的GCD值>=2,求共有多 ...
- UVa 11404 回文子序列(LCS求最长回文串长度)
https://vjudge.net/problem/UVA-11404 题意: 给定一个由小写字母组成的字符串,删除其中的0个或多个字符,使得剩下的字母(顺序不变)组成一个尽量长的回文串.如果有多解 ...
- php 添加时间戳
<?php $tomorrow = mktime(,,,date(,date("Y")); echo "Tomorrow is ".date(" ...