m******t 发帖数: 635 | 1 我C#写过一般规模的async + multithreading的service,Java没有相关经验,最近打
算把这个service用Clojure重写一遍,也在考虑相关的思路,打算尝试下Core.async,
多线程方面打算学prismatic,直接用java.util.concurrent或者简单包装下。
这个是Prismatic他们的一篇博客,讲他们用的技术:
http://blog.getprismatic.com/blog/2012/4/5/software-engineering
相关部分摘要:
While we make heavy use of the core of Clojure, we don't use its concurrency
primitives (atoms, refs, STM, etc.) because a function like pmap doesn't
have enough fine grained control for our needs. We opt instead to build our
own concurrency ... 阅读全帖 |
|
z****e 发帖数: 54598 | 2 其实ws,async和language三者本身没有必然联系
但是实现async的ws还是比较缺少规范,现在ws一般都是sync的
所以异步的还需要一些规范,目前比较缺这种规范,所以很多时候都是自己定义自己实现
现在就在讨论,怎么支持这种规范,因为传统的ws已经做得没啥可做的了
就像soa也已经相对成熟,没啥可搞了,就开始搞event driven soa
with |
|
|
g*****g 发帖数: 34805 | 4 小系统上用async programming本来大多就是杀鸡用牛刀。
UI不过几个线程,还算不上async programming |
|
T*******i 发帖数: 4992 | 5 NIO跟async有啥关系?
Netty没有async file io,mina有个,只支持linux |
|
N********n 发帖数: 8363 | 6
这就是您的SOA理念?汗。HIGH TRAFFIC SERVICE最反感某个REQUEST坐在
那占着系统资源BLOCK傻等,所以才推广ASYNCHRONOUS CALLBACK。ASYNC
和AWAIT就是简化ASYNCHRONOUS CODING用的。
JAVA Future.get()是BLOCK,C# AWAIT是CONTINUATION。你不懂所以才把
SPRINT @ASYNC拿出来充数。 |
|
a*****e 发帖数: 1700 | 7 你有这样的感觉没错,Python 的这些概念都来源于 FP,事实上,从 Lisp 引入 GC 开
始,非常多的 FP 的特征,已经越来越普遍地进入到其它非 FP 的语言。
我想你要问的是,既然这样,为什么要学习 Haskell 或者 FP?
我给几个 Haskell 有,但是你在 python 里面学不到的东西吧:
1. Strong type system
duck typing 看似更灵活,但是实际上它只是一个 sum of all types,没办法保证
type safty。有时候更 general 不是好事情,反而是有限制,尤其是编译器能够通过
静态检查就能确保程序遵守了这些限制,更有益处。举个例子,很多语言都有 SQL 的
库可用,但有几个能够静态检查,确保所有发出的 SQL 查询都是合法的?再比如,一
个程序需要处理平衡二叉树,你能够通过静态检查就确保不会发生不平衡的情况出现吗
?这些只有强类型的 abstract datatype 才能做到。
如果你要进一步学习 type system,那么 LYAH 这本书是不够的,需要看一些程序语言
的教科书。
2. Monad
首... 阅读全帖 |
|
a*****e 发帖数: 1700 | 8 你有这样的感觉没错,Python 的这些概念都来源于 FP,事实上,从 Lisp 引入 GC 开
始,非常多的 FP 的特征,已经越来越普遍地进入到其它非 FP 的语言。
我想你要问的是,既然这样,为什么要学习 Haskell 或者 FP?
我给几个 Haskell 有,但是你在 python 里面学不到的东西吧:
1. Strong type system
duck typing 看似更灵活,但是实际上它只是一个 sum of all types,没办法保证
type safty。有时候更 general 不是好事情,反而是有限制,尤其是编译器能够通过
静态检查就能确保程序遵守了这些限制,更有益处。举个例子,很多语言都有 SQL 的
库可用,但有几个能够静态检查,确保所有发出的 SQL 查询都是合法的?再比如,一
个程序需要处理平衡二叉树,你能够通过静态检查就确保不会发生不平衡的情况出现吗
?这些只有强类型的 abstract datatype 才能做到。
如果你要进一步学习 type system,那么 LYAH 这本书是不够的,需要看一些程序语言
的教科书。
2. Monad
首... 阅读全帖 |
|
|
N********n 发帖数: 8363 | 10
找点.Net ASYNC PATTERN看看。JAVA转过来的通常对ASYNC概念很模糊。 |
|
w***g 发帖数: 5958 | 11 绝对是解释器性能问题. async vs thread这个一直都没有定论的说. 而且
javascript只能用single core. Ruby python这种解释性语言从来都不以性能见长.
如果要benchmark async vs thread, 必须内上c/c++才能说明问题. |
|
G***l 发帖数: 355 | 12 如果你要知道细节的话,Eric Lippert的blog上有一个系列Asynchrony in C# 5。
async不等于parallelism或者concurrency,不一定是多线程的,也可以是单线程。抛
开compiler和runtime的实现,简单形象的来说async就是把你的程序分解成若干step并
且理清他们的前后依赖关系(await决定了依赖)。这样原本a->b(b1->b2->b3)->c(c1-
>c2)这样一串顺序的东西或可被拆分为细小的step并且形成a->b2->c1,b1->b3,c2这三
个互相独立的运行顺序。然后runtime自然可以选择把他们分别放到不同的thread上。 |
|
k**********g 发帖数: 989 | 13
async/await 是很危险滴。。。
简单举例∶发送方必须知道/指定收件人是谁。在 C# 底下,收件人可以是∶main UI
thread,framework-specific worker thread (WPF),或是 TPL parallel thread
pool。
比如你要给你的仇人送些溪钱,为了掩人耳目,你故意写错收件人地址,而在回邮地址
写上仇人的地址。结果因为地址不清,邮差把信送到你父母家里去了。
详情请看 http://www.infoq.com/news/2013/07/async-await-pitfalls |
|
x****d 发帖数: 1766 | 14 Can you explain poll please? I heard that often, select, poll, what is the
difference? Java NIO2 has call back, why it does not qualified as async?
When Pecking2 said async programming, what exactly he meant? excluding non
blocking? |
|
g*****g 发帖数: 34805 | 15 You assign 100 IO tasks to 100 workers (sockets), you check them one by one
nonstop until one of them has data and do something about it, that's called
polling.
If you register a callback and asks the workers to notify you when it has
data (or when completed), that's async IO, obviously in the later case you
don't need a manager thread. Interested party can register callback on their
own. Both are non-blocking however, compared to 100 threads blocked on 100
IOs.
NIO2 has async IO, NIO doesn't, i... 阅读全帖 |
|
N********n 发帖数: 8363 | 16
Like someone already points out, asynchronous callback is basically
a 'goto' statement. If you can avoid goto in your code you improve
its quality a lot.
c# marks code w/ 'async' and 'await' keywords to tell compiler to
generate the tedious control code behind the scene for you. No need
of explicit asynchronous callbacks.
That way when you have to execute several asynchronous methods to
finish one job. You don't have to break it down into several "goto"
callbacks. You could wrap them up logical... 阅读全帖 |
|
c******o 发帖数: 1277 | 17 今天卡看了一个slides,明白为啥我觉得akka没啥用。。。
http://www.slideshare.net/jboner/going-reactive-eventdriven-sca
Jonas Bonér TypeSafe CTO 做的, 里面讲了编写parallel时候可以用的工具(都很
流行啊)
1.先用immutability, future/data-flow 等语言直接支持的的工具,能并行够用就好
2.不够用,用Actor/Rx/Agent, 这类Async的分散式计算工具,这样可以有async的通讯。
3.不够用,必须有transaction,和share states, 就再加上STM
4.还不够用,那就只能上old Locks/显性thread 了。
我么只用到了 1/2之间,可能以后有3 |
|
c******o 发帖数: 1277 | 18 你这儿的假设就是场景之间的联系很少,可以近似看成独立的, 而且你也没法控制人
群(wow就碰到过很多次)。
独立的node如果能力够是可以availability/consistency(场景内一致)都有
所以不需要async/parallel
只有必须多node/thread/process才是要async
FB/twitter以前肯定也不需要考虑这个,但是数据量上去了不就必须考虑了么? |
|
c******o 发帖数: 1277 | 19 你保不保证各个async之间的message顺序? 保证到达? 保证互相之间执行的顺序?互
相之间通讯的那一部分。
这个解耦 可不简单,所以immutability好,要是以前的flow/algorithm不是并行的,那
么async有什么意义呢?有时候还要改flow/algorithm,这是编程的overhead
在 分散,并行系统里做到这样就会有overhead,你是fire and forget?还是guarantee
delivery? guarantee sequence?handle partial failure。 都是运行时候的overhead
.
如果在一个大的系统里,多用node会抵消这些overhead,带来好处,这就是
scalability.
要是本身一个两个node就解决了,那做这个干嘛? |
|
g*****g 发帖数: 34805 | 20 你完全不知道自己在说啥呀,所有的validation,都不需要参与transaction。一个个
外部validation跑过去,过了发个token,让用户点击确认,连这个token一起提交才产
生用户,这之前完全没有本地数据库参与,没什么瓶颈。而产生用户这一步用我说的
sharding
可以很轻松的解决。如果某个外部validation API不能处理这个并发量,那是外部服务
scalability的问题,不需要在这个网站里解决,也没法在这个网站里解决。
如果transaction参与validation是没法注册用户的原因,那是设计的错误,但不等于
必须用async解决,transaction本来就是越小越好。你让用户提交大量invaliid的数据
到数据库里本身就不是什么好的设计。我再说一遍,amazon至少在UI上来说,是个sync
process,提交订单就立刻跟我说成不成功,订单立刻就产生一个transaction提交到
数据库。如果有异步的process来
另外验证这个订单,那也是另一回事。
我说这么多帖子,提出来的解决办法的核心就是用户直接完全没有关系,可以完美划分。
... 阅读全帖 |
|
T********i 发帖数: 2416 | 21 其实boost的ASIO做的真够烂。要是能成标准还真是奇怪了。
Java的IO刚开始也是一塌糊涂。NIO是2002年才推出的。我可以说的他的设计很好。我
很满意。
但是java的NIO也不是没有问题。迄今为止,java NIO都不能很好地处理async SSL。我
知道是为什么,估计本版知道这个事实都不多。
不能很好地处理async SSL,明显的弊病意味着在手机上基于加密SSL的推送将很困难。
这也是依赖于标准库的问题。人家不好好做,你只能受着。
其实写一个C++的socket库,透明支持SSL/TLS以及其他协议的,包括SMTP, HTTP之类的
所有可能的协议。也不是很难。就几千行,不到10000行而已。但是我知道,知道这东
西需要解决的问题在哪里的,都屈指可数,更何况真正做出来了。
BTW,我确实有自己的C++ socket库。我不打算open source。 |
|
d*******r 发帖数: 3299 | 22 看了,有用信息很多, 多谢转帖。
不过对 Python 的主要抱怨在 Twisted的复杂 和 Django的笨重。正好这2个我都不喜
欢,以后估计也不会用。写简单的单进程concurrency我就准备用 Python 自带的
generator/yield 了,写 web 很多人都开始用 Flask 代替 Django 了吧。不过单进程
要快,确实得上 Node.sj&V8.
摘抄些有用信息:
The zen of Node.js is its minimalist core, both in size and in features. You
can read the core lib Javascript in a day, and one more day for the C++.
Don't venture into v8 itself, that is a rabbit hole, but you can pretty
quickly understand how Node.js itself works.
Our experience was that we just n... 阅读全帖 |
|
n****1 发帖数: 1136 | 23 Javascript的gocha可不仅仅是历史错误而已, 用js的人每天都在创造新的gocha.就拿
node.js来说吧, 为了做到async, 结果是callback满天飞, 比C里面的goto更恐怖。
Async明明有更好的实现方法, 比如future/promise之类的, 还有最近新加的yield,
但nodejs的社区与代码风格已经初步定型了, 这个gocha将永远影响node的未来。
你说只用"the good part"说来容易做来难, 一不小心就踩线了。 而且你终究要用别
人的库吧, 怎么保证别人的库没用到bad part呢? 运行中出了问题责任可在你啊。 |
|
p*****2 发帖数: 21240 | 24 http://queue.acm.org/detail.cfm?id=2567673
信息量太大了。
We did some prototyping with Ruby and Python using the evented frameworks
EventMachine and Twisted. The bottom line was that Node proved to be 2-5
times faster than both of those in terms of raw throughput. What was even
more exciting and really sold us on Node was that it took only two or three
hours to write the Node prototype while it took us more on the order of a
day or two to write the EventMachine and Twisted ones, just because we had
to ... 阅读全帖 |
|
d********g 发帖数: 10550 | 25 应该就是官方和非官方而已,社区应该会有自发的backport(如果单独抠出来难度不大
的话)。具体这个async是不是需要Python 3的新特性的支持还不清楚,现在还比较早
。不过参与的人中有不少以前做Twisted的,而Twisted还只能用2,不知道龟爷会不会
强行规定这个async库不要兼容2 |
|
z****e 发帖数: 54598 | 26 libs r tools
and most of tools have nothing to do with async
async is just a mechanism |
|
a***n 发帖数: 538 | 27
我觉得node主要还是async是底层支持的吧,因为js本身不支持多线程,所以js的程序
员写callback比较顺手。python 2的async都是纯python实现的效率和语法支持确实差
点,一般的程序员也掌握不了。 |
|
|
|
s**********k 发帖数: 88 | 30 Redis不是async的
我们这里有个组还想把REDIS改成async, multi-threading (for Redis server) |
|
g*****g 发帖数: 34805 | 31 client 端起个threadpool支持伪async的是有一些,比如MariaDB就有这样的client,
完整的服务器async支持就还没有见到。 |
|
g*****g 发帖数: 34805 | 32 Helloworld 还async来 async去的。C#都有啥牛逼应用呀? |
|
l**h 发帖数: 893 | 33 那你给讲得仔细一点吧。
你的意思是说,async call返回之后,就不在需要任何CPU资源?比如说在node里从磁
盘读一个文件到内存,async的load_file()被call然后很快返回等待,这个期间,读磁
盘这个工作是怎么完成的,不需要另外一个线程来处理吗?如果需要另外一个线程,不
也需要线程切换吗?
CPU |
|
|
p*****2 发帖数: 21240 | 35
多线程并发还是不够好。
我又看了看,感觉scala有这几种并发模式,但是async IO还是很麻烦。准备看看Go了
。Async的话,Node和Go做的更好。 |
|
b*******s 发帖数: 5216 | 36 #include
#include
#include
#include
using namespace std;
using namespace std::chrono;
high_resolution_clock::time_point get_tick()
{
return high_resolution_clock::now();
}
int main()
{
using check = future;
deque checks;
for (uint64_t loop = 0;loop < 1000;++loop)
{
checks.push_back(async(launch::async,get_tick));
}
high_resolution_clock::time_point prev = checks[0].get();
checks... 阅读全帖 |
|
z*******3 发帖数: 13709 | 37
restful多半是http
jaxrs,jaxws,用tomcat就可以host,然后jdbc
这种做法网络上各种傻瓜教程比较多
各种ide可以做到比较强力支援,不用async的话可以做到异常傻瓜化
如果用async的话,可以用undertow
如果是我自己做,肯定用vert.x
用JDBC client和web
语言groovy, java, js, ruby随便选一个
主要是vert.x的web,ide等傻瓜工具比较少 |
|
d****n 发帖数: 1637 | 38 bluebird || highland work with async.
debug 实在是callback hell 引进来得,如果能结合promise and async, 再用些
commercial tools, e.g nodetime, strongLoop ? |
|
c******o 发帖数: 1277 | 39 谁说没有关系?
我们选 play spark的最大原因就是因为 fp 编reactive/async/distribute/autoscale
的容易。
事实上也达到了要求。async,reactive,distibuted的资源利用率高。容错性强。易于
扩展。你以为都是吹牛?
最近刚刚经历了一个700%load jump到 about 1M rpm
非常smooth,虽然主要的concern在mongodb,和一些3rd party service, 但是其他方面
表现的非常完美。
由于autoscale,整个过程几乎可以用boring来形容,总结的时候scala/play就占一席地位
减少代码绝对不是我们的要求,事实上,刚开始代码加注释比java多。
现在也就是少一些而已。 |
|
p*****2 发帖数: 21240 | 40 vert.x async 库不全吧?所以不能做到完全async。
骗子 |
|
z****e 发帖数: 54598 | 41 io优势你说的是async吧
你根本没弄明白async到底啥意思吧?
node本身就是抄袭eventmachine的产物这个知道吗?
node慢又不是什么新闻,随便找个benchmark都可以告诉你结果
https://www.techempower.com/benchmarks/
无数人贴过很多遍的东西了
异步本身可以带来效率上的提升,但是这个跟node没半毛钱关系
也只有你这种半吊子才会以为这个东西是某个语言独有的
丢人现眼 |
|
p*****2 发帖数: 21240 | 42 vert.x async 库不全吧?所以不能做到完全async。
骗子 |
|
z****e 发帖数: 54598 | 43 io优势你说的是async吧
你根本没弄明白async到底啥意思吧?
node本身就是抄袭eventmachine的产物这个知道吗?
node慢又不是什么新闻,随便找个benchmark都可以告诉你结果
https://www.techempower.com/benchmarks/
无数人贴过很多遍的东西了
异步本身可以带来效率上的提升,但是这个跟node没半毛钱关系
也只有你这种半吊子才会以为这个东西是某个语言独有的
丢人现眼 |
|
q*c 发帖数: 9453 | 44 现在有 fiber, 可是起上百万的 fiber, 而且还是 sync 的, 容易读。
async 就不是人脑的思维方式, 人脑适合顺序线性。 哪怕各种 async 叫的再欢, 你
看 future 等技术, coffee script..等等 还是往object oriented, 顺序线性执行上
靠。
人的嘴是最无聊的东西, 你要看他们做什么, 而不是说什么,
好? |
|
z****e 发帖数: 54598 | 45 +观感正面,-观感负面
lambda +,写程序更简洁些
currying -,混乱,map到底是func还是obj?
1st-class func -,混乱,理由同上,同时需要跟immutable配合
immutable -,同上
monad +,collection部分不错,但是如果是包装其他的则观感负面
functor +,不错,理由同上
dynamic type +,有限滴使用,搬运数据时候用,否则混乱
async +,可以提升性能
single thread -,这哥们是来搞笑的
scala以上全部都可以做,也都可以不做
clojure到dynamic type以上都必需做到,谁让它纯呢?
java基本上就只允许做观感正面部分,除了dynamic type
which可以交给groovy完成,负面部分不是特别麻烦就是会被禁
java8加了lambda
vert.x有async
rxjava有functor和monad |
|
z****e 发帖数: 54598 | 46 鬼知道那个小孩在做啥,你也不知道zlike后台是怎么做的
需要什么数据,存了什么数据,app和app是不一样的
有些app占用的disk比较小,有些app占用disk比较大
这都很正常,最简单的标准就是看他到底需要多少disk
这个由用户自行决定,现在问题是zlike已经说了他需要40g的disk
你翻来覆去想推翻这个condition想做什么?
你是想告诉他,20g对于他来说足够用了还是怎么滴?
你的意思是不是他的设计太糟糕了?well,前面貌似有个id就这么说了
我靠,这样的vendor要是来卖cloud,估计直接被轰走了
手游对战async个大头,游戏我第一次听说有async的
还是对战,对战尤其需要sync,因为必需确保所有人在same page上
否则玩个p啊,你打你的,我这边还不一样,我的天,那搞什么
你没事别学个web词汇就来忽悠 |
|
N********n 发帖数: 8363 | 47
It's not just 游戏 that io等待时间长. Any server side code could
have the same problem. Imagine your server code has to call web
services hosted on remote sites. Such calls are io等待时间长 as
well. So async / non-blocking is needed on basically all heavy
traffic sites. You cannot simply say "普通server async没啥区别" |
|
h*******u 发帖数: 15326 | 48 async sync都是比较花哨的概念,把多线程玩熟了比较重要。万变不离其宗。
async
pool |
|
S***k 发帖数: 370 | 49 c# task not always async.
If read/write file, http client call, or db access, it can be async.
If just call Task.Run(), it still uses the thread pool and has more switch
overhead. It is more like multiple threads if there is nothing to wait. |
|