Y**G 发帖数: 1089 | 1 正常写法:
void foo() {
doA();
doB();
doC();
}
异步+FP写法:
fooAsync(OnCompleteCallback onComplete) {
doAAsync(new OnCompleteCallback() {
public void onComplete() {
doBAsync(new onCompleteCallback() {
public void onComplete() {
doCAsync(onComplete);
}
}
}
}
} |
|
Y**G 发帖数: 1089 | 2 还是用Java舒服
假定
SimpleFunctionTask -- 异步执行一个函数
SequentialTask -- 将两个task串行执行
CompositeTask -- 同时启动多个task
new SequentialTask(
new CompositeTask(
WAIT_ALL,
new SimpleFunctionTask(new Runnable() {
void run() {
useQuote = connection.getCurrentValue(USD);
}
},
new SimpleFunctionTask(new Runnable() {
void run() {
useQuote = connection.getCurrentValue(USD);
}
}
},
new SimpleFunctionTask(new Runnable() {
void run... 阅读全帖 |
|
p*****2 发帖数: 21240 | 3 在Node的带领下,终于归拢了Python和Java了。
Java系的代表zhaoce祭出了大杀器vert.x
Python系的公孙大神也要python原生支持异步了
这次大家都殊途同归,没什么好争论的了吧?
还有啥语言不服气的吗? |
|
l**********n 发帖数: 8443 | 4 没有design pattern的异步其实是很难维护。 |
|
T********i 发帖数: 2416 | 5 什么叫归拢了?我的系统向来都是C++,Java,.Net做3套。
而且我IO向来都是异步的,10年前就如此了。 |
|
|
|
A*****i 发帖数: 3587 | 8 异步就是你拉屎的时候还在看微博
同步就是你手机忘厕所外面了拉完屎才能看 |
|
a***n 发帖数: 538 | 9 对了前两天我还维护一个半异步的库。
用了nonblocking io,有event loop,是独立运行的但又不是一直运行的。当主程序要
读写socket的时候进loop同时给一个退出条件,条件达到后再退回主程序。 |
|
c******o 发帖数: 1277 | 10 现在这波潮流有三个level
第一,异步就是non-blocking,尽量把schdule添的满满的,never block
第二,就是并行,这个要求最好immutability, no side effect.
第三,分布,这个要求更高,要很好的design,architecture和工具,很多big data/
cloud本质就是这个。
流行什么是有原因的。 |
|
c******o 发帖数: 1277 | 11 有对vert.x 的设计师的专访,他说他对akka很尊敬,认为做的类似(会更类似),
vert.x 能用多种语言,akka是java/scala only.
但akka里的fail safe强一些,akka还有future/STM(就是做上面异步层,并行层的),
不光是分布层。 |
|
l*****9 发帖数: 9501 | 12 我做过一个大公司的招工网站。他们每天最多几千个opening, 新员工check
background部分,一般就是几十个case, 同步反应时间45分钟,异步反应时间3分钟。说
同步更快的根本不懂网
站。 |
|
L*****e 发帖数: 8347 | 13 那就更不理解了,既然是累积的,干嘛堆到一天中来处理?而且backgroud check需要
同步干嘛,不立刻给结果别人要接别的地儿的offer了?然后是同步45分钟,异步3分钟
出结果,只能说明一个问题,你们的同步写的有问题,每个candidate的backgroud又不
是耦合数据,你们还做出死锁来了?还是说这几千人之间有各种各样亲戚关系,公司的
雇佣规则是五服以内的亲戚不能在同一公司打工,所以数据是强耦合数据了?
还是说虽然广告是几千openings,但是位置实际上只有一个,你们做的是几千人的抢位
置系统,backgroud check先做完的先得?
★ 发自iPhone App: ChineseWeb 8.2.2 |
|
n******1 发帖数: 3756 | 14 详细解画一下怎么做
这里的同步,异步是什么意思 |
|
l*****9 发帖数: 9501 | 15 录用一个人,其中一步是查它的多项background,要talk to external system.同步做
法是在web page一个field一个field的check.异步做法是输入自报值,后台check.两个
check方式也略有区别 |
|
l*****9 发帖数: 9501 | 16 同步check, hold session. 异步不是 |
|
n**x 发帖数: 606 | 17 这跟同步异步什么关系,顶多是一开的设计比较脑残,然后改进而已啊。
result. |
|
l*****9 发帖数: 9501 | 18 不是。十个recruiter, 每人有3个新员工,总共30个case. 这些case互相不相关,可以
同时输入。每个case比如有12个field need check,在web page上一个一个field check
, 每个case需要45分钟。异步方案:每个需要检查的field都输入自报值,submit page
,后台check.
同步是烙印写的,觉着用户不多。 |
|
L*****e 发帖数: 8347 | 19 看来有人理解同步就是人坐在机子前发出一个request,等待一个response,再发一个
指令,再等待一个response,再发出一个。。。而异步就是把一堆指令一起发出去了,
然后response一起回来。。。
看来是我学艺不精,不扯淡了,我秉烛学习去了。。。
★ 发自iPhone App: ChineseWeb 8.2.2 |
|
L*****e 发帖数: 8347 | 20 你这个“同步”“异步”的performance比较,是说系统计算时间比较?还是包括前台
人工打字喝水聊天打嗝放屁侃山啊?
check
page
★ 发自iPhone App: ChineseWeb 8.2.2 |
|
z*******3 发帖数: 13709 | 21 啧啧,不懂异步的人来表演了
回去做你的医疗器材好吧
别装内行了 |
|
l*****9 发帖数: 9501 | 22 这其实是个小应用,网站并没有拥堵,但是它说明access external system应该异步。
这个例子和obamacare website更像一些。
网站拥堵的情况,应该减少request,尽量静态response. 具体到12306,就是说,订单
发出去,不应该即时给订票结果, 具体订票过程应该在request/response cycle以外。
老魏老姜等不懂网站设计的可能根本不懂request/response是什么东西。
如果让我去做高频交易编程,我会考虑 C 和一部分汇编语言。 |
|
d********g 发帖数: 7458 | 23 我们的网站后台遇到这么个问题,大概可以抽象成这样子:
import requests
for i in xrange(10):
response[i] = requests.post(API_URL,data={func(i)},timeout=30, verify=False);
# next step, processing response[]
API_URL是国内的API接口,因为连接速度比较慢,所以timeout设成了30来确保连通率。
目前的问题是10次循环下来,因为是阻塞式的,时间会拖得比较长。假设每次requests
平均需要15秒,一共就要150秒。
请问有什么异步的办法,能够同时并发这10次连接请求,然后等所有的response[i]全
收集齐了再做下一步? |
|
|
z****e 发帖数: 54598 | 25 另外,只有node才需要ipc
其它框架都是itc
这就是为啥node很傻逼
像单线程一样编程是目的
但是你真把所有东西都做成单线程的话
那个thread挂了咋办捏?
哪怕是一个不小心,被阿三程序员写段代码blocked了
你不一样很苦逼?
当然这个问题哪怕是弄成itc一样存在
但是至少至少,其它启动的threads会在一定程度上抵消这个问题
我猜测这就是为啥在大多数报告里面,node总是会有丢包的问题
可能就是那个线程出了问题,把所有鸡蛋全部放在一个篮子里
自然会出问题,vert.x说,我按照cpu有多少个core来建threads
一个dual core的cpu,vert.x就启两个threads,如果是两个这种cpus
就起2*2=4个threads,这样万一其中一个thread被blocked,一样不会挂,对不对?
当然blocked在异步编程中是错误的,而且同一个process下处理communication
比起多个processes下处理,那是要强太多了,不同process之间做c,那很苦逼的好不好
得调用第三方工具,各种狗血问题,所以你还是用node的思维来看其他多线程... 阅读全帖 |
|
z****e 发帖数: 54598 | 26 btw,我机器上启动一个process要30ms,而启动一个thread只要不到1ms,平均只有.1ms,
process带来的overhead实在是太高了,300倍的差距,而几乎所有的worker无论node
还是vert都需要额外启动process/thread,30ms实在是太慢了!足够我10g的内存做20次
左右的大gc了,小gc就更多了,有兴趣的自己在电脑上试试,你好容易用异步省下来的
时间就都被process的包装给消耗掉了 |
|
z****e 发帖数: 54598 | 27 用多线程搞异步,就是用ejb方式折腾worker都可以,完全可以对每一个worker实例单
独启
动一个thread, 但是如果是process, 就没戏了,很容易就出问题了 |
|
z****e 发帖数: 54598 | 28 io优势你说的是async吧
你根本没弄明白async到底啥意思吧?
node本身就是抄袭eventmachine的产物这个知道吗?
node慢又不是什么新闻,随便找个benchmark都可以告诉你结果
https://www.techempower.com/benchmarks/
无数人贴过很多遍的东西了
异步本身可以带来效率上的提升,但是这个跟node没半毛钱关系
也只有你这种半吊子才会以为这个东西是某个语言独有的
丢人现眼 |
|
z****e 发帖数: 54598 | 29 我知道node怎么搞的呀
问题是node无法像vert一样自由创造threads
这个就是一大限制
只要保证threads之间独立,异步很容易搞
有了lambda该有的就都有了,完全不需要屈从worker其实
自己写也就是分分钟的事 |
|
|
z****e 发帖数: 54598 | 31 另外,只有node才需要ipc
其它框架都是itc
这就是为啥node很傻逼
像单线程一样编程是目的
但是你真把所有东西都做成单线程的话
那个thread挂了咋办捏?
哪怕是一个不小心,被阿三程序员写段代码blocked了
你不一样很苦逼?
当然这个问题哪怕是弄成itc一样存在
但是至少至少,其它启动的threads会在一定程度上抵消这个问题
我猜测这就是为啥在大多数报告里面,node总是会有丢包的问题
可能就是那个线程出了问题,把所有鸡蛋全部放在一个篮子里
自然会出问题,vert.x说,我按照cpu有多少个core来建threads
一个dual core的cpu,vert.x就启两个threads,如果是两个这种cpus
就起2*2=4个threads,这样万一其中一个thread被blocked,一样不会挂,对不对?
当然blocked在异步编程中是错误的,而且同一个process下处理communication
比起多个processes下处理,那是要强太多了,不同process之间做c,那很苦逼的好不好
得调用第三方工具,各种狗血问题,所以你还是用node的思维来看其他多线程... 阅读全帖 |
|
z****e 发帖数: 54598 | 32 btw,我机器上启动一个process要30ms,而启动一个thread只要不到1ms,平均只有.1ms,
process带来的overhead实在是太高了,300倍的差距,而几乎所有的worker无论node
还是vert都需要额外启动process/thread,30ms实在是太慢了!足够我10g的内存做20次
左右的大gc了,小gc就更多了,有兴趣的自己在电脑上试试,你好容易用异步省下来的
时间就都被process的包装给消耗掉了 |
|
z****e 发帖数: 54598 | 33 用多线程搞异步,就是用ejb方式折腾worker都可以,完全可以对每一个worker实例单
独启
动一个thread, 但是如果是process, 就没戏了,很容易就出问题了 |
|
z****e 发帖数: 54598 | 34 io优势你说的是async吧
你根本没弄明白async到底啥意思吧?
node本身就是抄袭eventmachine的产物这个知道吗?
node慢又不是什么新闻,随便找个benchmark都可以告诉你结果
https://www.techempower.com/benchmarks/
无数人贴过很多遍的东西了
异步本身可以带来效率上的提升,但是这个跟node没半毛钱关系
也只有你这种半吊子才会以为这个东西是某个语言独有的
丢人现眼 |
|
z****e 发帖数: 54598 | 35 我知道node怎么搞的呀
问题是node无法像vert一样自由创造threads
这个就是一大限制
只要保证threads之间独立,异步很容易搞
有了lambda该有的就都有了,完全不需要屈从worker其实
自己写也就是分分钟的事 |
|
|
|
B********r 发帖数: 397 | 38 艾玛不懂还骂人?
async的实现就是用的Task(c#)/Future(java), 这两个都是在thread基础上,
只不过multi task share same thread,你去看看人家source code再来扯
即使是单个request,non-block IO 也是要的,只不过一样可以用thread pool来代替
zhaoce 说的没错,java servlet用的thread pool一样跑的快,node.js即使用了async
,除了io 能够真正non-blocking其它更慢,还要context switch
游戏的异步就是因为request多而且杂,其中io等待时间长,而维持大量的thread pool
太消耗资源
普通server async 和multi threading 没啥区别 |
|
|
l**********n 发帖数: 8443 | 40 java Future, c# Task, javascript Promise都是异步。 |
|
z****e 发帖数: 54598 | 41 future并不是真正的异步
callback的时候会block
当然wwzz说了completefuture那个我不知道
没有用过,不知道运作原理如何
但是最原始的future还是容易block住
而用了lambda之后就可以不用future
直接把callback func扔进去就好了
java8之所以需要弄lambda多少也是为了这个考虑
否则弄个匿名类放进去就有些怪异了
但是lambda层层嵌套还是会造成灾难
所以要用rxjava |
|
l**********n 发帖数: 8443 | 42 php也可以异步:
$client->get('http://httpbin.org', ['future' => true])
->then(function ($response) {
echo $response->getStatusCode();
}); |
|
z****e 发帖数: 54598 | 43 找了下,总算找到学名了
future那种问题叫做异步里面的状态
是比较糟糕的用法
callback那种叫做回调
subscribe那种叫做通知
后两者本质上是一样的其实
当然通知比较flat,回调容易金字塔
所以最终还是要用rxjava的subscribe
而如果没有lambda的话,就需要额外加多一层封装
那就是匿名类,swing里面经常出现匿名类和final
其原理就是fp的immutable |
|
b***i 发帖数: 3043 | 44 我倾向与线程blocking,你倾向于单线程non blocking,那就不用异步了?
看起来,这个和我对待串口一样,用查询方案?具体咋写?我还是要用asio的,不想用
裸的C,asio不是跨平台嘛 |
|
b***i 发帖数: 3043 | 45 都有了,根据asioref-1.10.6.pdf,使用的是async_accept,然后
asio::io_service io_service;
tcp_server server(io_service);
io_service.run();//这一步怎么替换成异步?
public:
tcp_server(asio::io_service& io_service)
: acceptor_(io_service, tcp::endpoint(tcp::v4(), 13))
{
start_accept();
}
private:
void start_accept()
{
tcp_connection::pointer new_connection =
tcp_connection::create(acceptor_.get_io_service());
acceptor_.async_accept(new_co... 阅读全帖 |
|
|
|
b***i 发帖数: 3043 | 48 我的项目的具体设计是一个嵌入式的服务器用Linux, C++11, ASIO, JSON等
客户端向服务器请求connect
连接后,服务器向客户端发送一个问题,
客户端回答
服务器回答对了
客户端开始发送JSON
服务器解析后进行动作,然后发送返回的信息
问题在最后一行:如果这个动作需要时间,我这些动作要在handle_read里面进行,还
是另起一个线程?我在进行这些动作的时候是否可以锁定信号灯?或者是比较简单的
lock?比如我要写一个变量,但是多个server可能同时访问这个变量,所以要lock再写。
目前采用boost的一个例子:
void start_read() {
// Set a deadline for the read operation.
input_deadline_.expires_from_now(readTimeout_);
// Start an asynchronous operation to read a newline-delimited message.
asio::async_read_until(socke... 阅读全帖 |
|
S********t 发帖数: 3431 | 49 Guice倒是开源的,别的DI方案也有。想请教下,市面上有没有这样的轮子,来解决
processing step之间的dependency,framework去schedule每一个step的异步执行?
举个例子,我要写一个后端rpc service,处理一个rpc request,产生这个rpc的
response,这个过程中我需要执行若干个步骤
1: input request, output A
2: input request, output B
3: input A, B, output C
4: input request, A, C; output D
5: input B, D output final response
每一个步骤内部的logic可能是一个blocking computation,也可能是一个async call
(disk io or network call)。有没有这样一个framework能够理解这样的dependency并
且最优化的schedule这5个step的async execution,比如1和2可以并行run。不知道开
源社区有没... 阅读全帖 |
|
c*********e 发帖数: 16335 | 50 rxjava的异步,其实是 async + thread,不是node.js那样只有一个thread的async |
|