Redian新闻
>
Node.js 并发模型相关:closure 中 access mutable variable
avatar
Node.js 并发模型相关:closure 中 access mutable variable# Programming - 葵花宝典
m*m
1
大家好,昨天查询状态,发现如下:
No Objection Statement Requested May 28, 2013
No Objection Statement (Unacceptable) Received May 23, 2013
Fee Received May 16, 2013
Form DS-3035 Received May 16, 2013
Form DS-2019 Received May 16, 2013
Passport Data Page Received May 16, 2013
Statement Of Reason Received May 16, 2013
这是怎么一回事啊?多谢!
现在是一头雾水……
avatar
t*n
2
B2签证预约在上海领事馆,可以在外省(父母在浙江)的中信银行交付签证费用么?
谢谢,在线等。。
avatar
l*g
3
把I-20的原件当复印件扔了……幸亏检查了一下
avatar
y*i
4
玛雅历法:第四个世界的终结是2012年12月21日。
在飞机上发现离自己三排远的位置坐着张柏芝之后,陈冠希沉浸在一种绝望的情绪中难
以自拔。他无意识的盯着舷窗,十三岁时发现另外三个陈冠希的场景在眼前浮动。在发
现这个事实之后,他常常自信满满,觉得这是一种恩赐,一种在盲人之国中获得视力的
荣耀。但当他遭到其他射影师的拒绝之后,2011年5月8日,大限将至,陈冠希第一次觉
得这种对世界的知情是一种诅咒。
大厦将倾,他却无能为力。陈冠希痛苦的在座位上扭来扭去。我们的世界就要毁灭了。
1989年,陈冠希从加拿大来到香港。这是一个留存在别人的描述中陌生的城市,他没有
什么朋友,唯一的亲人是他的父亲。但是这个父亲仅仅是某些时光里转瞬出现的一个幻
影,他走近的时候,父亲就摆摆手:我很忙。塞给他一些钱,然后变淡,消失在楼梯的
转角。
他的童年已经注定他将是毫无色彩的一个孤僻小孩,进不去香港,回不到加拿大。但好
在他有摄影。
摄影师陈冠希,平面模特陈冠希,后期处理陈冠希,艺术评论陈冠希。
小小的孩子在大大的公寓,躲开打扫房间的工人,在楼梯间改造的暗房冲洗自己的照片
。一张一张,一千个不同的自己。某一天,他突然看到自己的照片里除了他自己之外,
浮现出了自己并不认识的陌生人,暗房里红色的灯光很像某个鬼片的场景,但他却并不
感到恐惧,因为照片上的他和另外几个和他一样瘦仃仃的少年笑的很开心,像是他某个
美梦里的场景。
这样的照片越来越多,到后来,大部分的照片都像是一种灵异照片一样。主人公像是陈
冠希本人,而又略有不同,背景里也经常会浮现一些看似在香港常见却又从未听说过的
街道名。他在很久之后才意识到,这些照片其实是另一个世界的映像。更久之后他才知
道,作为能够以相机拍摄到另一个世界的天赋者,尽管有许多诸如灵媒,通灵摄影师之
类的称呼,他们彼此有一个简单的自称:射影师。
我们的世界并不孤独,而且伙伴还不只一个。我们有时候抬头望天,觉得冥冥之中会不
会有另外一个自己。
有的。
陈冠希整理自己所有这些看似远离现实生活的照片,仔细的归类和分析,最终独立得出
了一个最合理然而最荒谬的结论。在我们的世界之外,还有其他的三个世界,每一个世
界都生活着一个陈冠希,甚至年龄也略有不同,这个世界的陈冠希是最小的。虽然他们
有不同的发型,不同的人生,不同的年龄,可总归有一点共同点,他们都是一个摄影爱
好者。这也许是他们能够在照片中传递这些来自异世界信息的原因。
每一年都有许多人拍出了一些让人头皮发麻的照片,并不存在的人,并不存在的街道。
大多数人只是陷于恐惧之中,以为自己遭遇了灵异事件。但陈冠希却在毫无提示情况下
得到了真相——平行世界里的自己。这并不奇怪,因为作为一个铁杆的漫画迷,平行世
界里同时存在着两个超人和三个蝙蝠侠实在是一个太过普通的概念,那么,为什么不能
有四个陈冠希呢?他在多年后,玩一款叫无限世界的网游时,看到游戏界面煞有介事的
介绍“四个不同的平行世界”,他扔掉烟,为一种荒诞感哈哈大笑。
在其他的三个世界里,一个陈冠希有一辆很酷的哈雷,是个流连街头的不良少年,一个
陈冠希是个读书很好的呆子,房间的一面墙上是各种奖杯,一个陈冠希的家境很差,父
亲是水管工,但却是最有女人缘的花花公子。这些世界里的陈冠希和我们这个世界里的
陈冠希像又不像,这些世界里发生的事情和我们这个世界里的事情似曾相识却又不尽相
同。
在那一瞬间,陈冠希意识到,自己在遥远的某处有三个兄弟,有三段不同的人生,在每
一个人生当中,他都不是没有朋友的。
来到香港以后,他第一次感觉并不孤独。
他开始向他人敞开心扉,尽管显得生硬,开始主动的寻找朋友。他最为注重的,是那些
在照片上出现的其他世界中他的朋友,这对于他,是一种最可靠的验证。他有了越来越
多的朋友,足够的金钱,缺少父母的管教,他成了学校里最酷的一群孩子之一,过去那
段没有朋友的日子,似乎成了一段过眼的云烟。
但在他所有的朋友当中,有一个朋友的位置比其他人更为重要,因为他同时出现在其他
三个世界所有陈冠希的身边。
第一次见到他,同行的大人就暗地指着他说,和这个孩子相处要留神,一不小心就会上
八卦小报,因为他就是谢贤的儿子。“我认得他。”陈冠希轻轻的说,但不是从八卦小
报上。
四个世界,所有的陈冠希最好的朋友,谢霆锋。
而现在他们已经形同陌路了,过去的友情已成一种尴尬。想到这里,陈冠希总要感觉痛
心。如何解释才能让谢霆锋相信,自己其实和这个世界的张柏芝没有发生任何关系?甚
至是连跟这个世界的阿娇,他们也只是点头之交。所有那些流出来的艳照,除去和杨永
晴是真实存在于这个世界的,和其他女孩的关系仅仅是发生在其他三个世界的陈冠希身
上的。如果他没有收集这些来自另一个世界的艳照……如果他是那个精通电脑的书呆子
陈冠希……如果他把电脑送去的是官方的维修中心……
但大错已经铸成。纵有千口也难以让人相信,这个世界的陈冠希其实是个忠贞不二的好
男人。
但陈冠希已经走过了这一段人生中的阴霭。如果世界不是要在一年零七个月后毁灭……
是的,世界要在一年零七个月后毁灭。所有不祥的预兆来自第一个世界的一张照片,陈
冠希骑哈雷摩托的世界遭遇了大地震。此后,灾难接二连三,飓风,洪水,倒塌的城市
,慌乱的人群,撕裂开的大地。最后,所有来自第一个世界的照片变成了一片漆黑,就
像你没有打开镜头盖。
不要怕,或许这只是那个世界的陈冠希停止了摄影。陈冠希这样安慰自己。但紧接着的
一年里,其余的两个世界通过照片显示,他们遭遇了同样的事情,或早或晚,像是一场
先后倒塌的多米诺骨牌。书呆子陈冠希的世界已经在四个月前毁灭,而父亲是水管工的
陈冠希的世界正开始陷入一片混乱。
陈冠希最开始自欺欺人的安慰自己,或许所有的世界都会毁灭,但并不预示着自己的世
界也会照着这个轨迹发展。比如日本就没有像其他三个世界那样发生地震和核泄漏。
2011年3月11日,陈冠希在电视前呆若木鸡。
他开始发疯似的收集有关末世的预言,最终在电影《2012》中找到了一些蛛丝马迹。在
玛雅人的历法中,2012就是纪元的终结。在他们的圣书 PopolVuh中提到:神相继创造
了四个世界,最后的一个世界就是我们所居住的世界。在公元2012年的12月21日,神将
创造第五个世界,而这预示着第四个世界的毁灭,人类的灭亡。
陈冠希陷入了巨大的恐惧中,一片黑色的未来在他的面前展开。他开始通过各种途径,
试图联系那些他所能找到的射影师们,最初他心存希望,认为这些掌握着通往另一个世
界窗口的人们一定能携起手来拯救这个世界。
在纽约的一处豪宅,一个女射影师表示无能为力,“Edison,我毫无办法。你和我有相
似的遭遇,在世界上所有人都不相信我是处女的时候,你觉得我还会人群有多大的热切
么?”她摆摆手。“Tinkerbell,送叔叔出去。”
在香港的一家饭店,一位资历极高的大鼻子射影师只能沉默无语,“这是注定的命运,
我们不可以违抗它。”他买了单,留下一个便条,“世界终归要毁灭,而我们的感动常
在。”
在陕西镇坪的一所监狱,陈冠希向射影师中的最高贤者求助,他苦笑一声,“你告诉世
界真相,而世界会把你当做疯子,或者骗子。”他背过身去,“正如没有人相信我真的
拍到了老虎。”
所有的知情者都保持沉默,是否要做那个铁皮屋里惊醒众人的呼喊者?陈冠希纠缠在这
个艰难的抉择。而这时候,水管工的儿子陈冠希的世界也走向崩塌,在来自这个世界的
最后一张照片上,他满脸血迹,在一个阴暗的屋棚里点着蜡烛,手持一张肮脏的包装纸
,用荧光笔的写着九个绿色的字。
“找到张柏芝,拯救世界。”
此后,其他三个世界的照片再无内容,只是一片漆黑,与其说是通往三个世界的窗口被
关闭了,倒不如说是这些黑色正是你从窗口所能看到的三个世界的结局。只能偶尔拍摄
到一些这个世界的照片。
镜头中的陈冠希满面愁容。
为什么要找到张柏芝?为什么找到张柏芝就能拯救世界?陈冠希不明白。自从艳照风波
之后,陈冠希已经和谢霆锋家人形同陌路,都在有意识的避开对方。尤其是张柏芝,她
如何看待让她蒙上不白之冤的陈冠希?她已经过上了相夫教子的生活,而且和谢霆锋十
分恩爱。自己如何能用这么一个听起来荒诞无稽的故事,说服她和他携手,抛家弃子,
去迎接一场像是玩笑一样的世界灾难?
怎么办?这时候,他抬头。远处的张柏芝,迅速的一侧脸,躲开了他的目光。
就是这么一瞬间的眼神交会,陈冠希忽然觉得,这个女人会跟我走。
拼了。
对不起,Nicholas。
但我必须拯救世界。
他站起来,有一点眩晕,空姐关切的凑过去,“没事,没事。”他说,“我见到老友。
”不用详细说明,全机所有人都知道他说谁。甚至连张柏芝两边的人都带着暧昧的神情
,做出了让位的准备。
他沿着走道过去,步履踉跄。
姑娘,我有一个新的故事要对你讲。
2011年5月8日,陈冠希和张柏芝相遇在一次航班上,而2012年12月21日,是我们这个世
界毁灭的日子。
陈冠希能够说服张柏芝离开家庭和他一起去拯救世界么?
他们两个真的可以改变我们的世界注定要被毁灭的未来么?
avatar
d*r
5
一个帖子,转来大家讨论一下
最近使用 closure 和 anonymous function 遇到些问题, 大家探讨一下。
简单说就是当临时写一个 closure 或者 anonymous function 当 callback 使用时候
,如果让这个 closure access 了 external scope 里面的 variable, 就容易出现 "
access mutable variable " 的问题 (WebStorm 就会报 warning).
比如这个帖子里面描述的例子:
http://samwize.com/2013/09/01/how-you-can-pass-a-variable-into-
里面的 callback 引用并使用了 external scope 里面的 i, 所以出错了。
他是通过用 bind( {i: i} ) 将 i 的值传入注册时候的 callback 来解决的,当然也
有其他方案, 比如将 dummy(i, function(response)) 改成 dummy(i, function(
response, i)) 也行。
我在想,上面这个问题可以通过 (某种方法) 将 i 的值传给 callback 来解决问题,
但是如果 i 是一个 object 的引用怎么办呢?
比如 i 是 someObjectRef = {name: 'abc', val: 123}, 然后这个 someObjectRef 也
可能在 callback 被注册后的将来,被改变,那当 callback 将来实际被执行的时候,
callback 里面的逻辑access 到的已经是 someObjectRef 将来的值了,比如 {name: '
ABC', val: 456}。那样的话,如果想 callback 里的逻辑使用 callback 注册时候的
someObjectRef 的值,岂不是传入 callback 的时候就得 copy/clone someObjectRef
当时的值?
这样做的话,就有点像其他 concurrent 模型里面的 "send a variable copy through
a message, but not give reference to the variable". 也就是说,Node.js 这种
single threaded 的模型,其实也是要隐性处理 issue of accessing shared
variables 的. 因为 single threaded 只是可以让 Node 的代码 access shared
variables 时候不用 lock;但是本质上讲, 注册 callback 了,就在将来开启另外一
个平行的执行流程了,那个执行流程和当前的执行流程 (以及其他 callback 执行流程
) 就可能 access shared variables.
大家说是不是这个道理?
另外,还想到一点,既然 closure accesses external mutable variables 这么危险
,是不是应该有一种编写 closure 的规范,比如所有 closure access 的变量,都应
该是:
case-1. 常数变量.
case-2. 这个变量的 most fresh copy (explicitly given/passed by calling
function).
关于 case-2, 比如在下面这种函数里面,就算是 most fresh copy:
receiveRemoteMessage.on('message', function(err, message) {/* process the
most fresh copy of this message*/}.
这里理想地假设 receiveRemoteMessage.on() 是在所有本地函数中最先得到这个
message 的, 处于 event chain 的唯一 root 位置.
大家怎么看这个问题.
avatar
s*u
6
Call Visa Office 202-663-1541, then dial 3, then wait in line.
or Fax to visa office at 202-663-2868 to see what happened
If Embassy sent, DOS not accept, it is a big trouble.
See below
发信人: shmu (shmu), 信区: Postdoc
标 题: 我的22个月J waiver经历(June 2006--April 2008)
发信站: BBS 未名空间站 (Mon May 9 16:00:37 2011, 美东)
我经历22个月J waiver.
1.Step1, 休斯敦领事馆负责J waiver的领事回到北京休假55天,其他领事拒绝受理我
的case, 我的case在休斯敦被耽误3个月。
2. 中国大使馆寄NOL后,过100天 DOS收到后,DOS把我的材料转到USCIS
VermontCenter后,DOS负责我的case的Visa Officer又发现我的NOL信件遗失,又向
USCIS Vermont Center撤回favorable recommendation letter,并且通知USCIS
Vermont Center冻结我的case.
3. DOS负责我的case的Visa Officer调离,新的VO Michael负责我的case,Michael无
意中找到了NOL, 这时候是中国大使馆寄出NOL后276天,我的case 状态变成NOL
received.
4. 我发现1个月过去了,我的case还是pending,向DOS询问多次,终于收到负责我的
case 的VO Michael的FAX, 告知我的所有材料除NOL外,全部被以前的负责我的case的
VO遗失,包括215美元Money Order复印件, DS-3035复印件和NIH的sponspor view.
5.我花了2个月时间,把材料补充完整,包括215美元Money Order的第三联复印件,DS-
3035复印件和NIH的sponspor view.
6. 在收到DOS的favorable recommendation letter的copy后,USCIS Vermont Center
告诉我,我的case已经被冻结一年之久(Infopass)。我又与USCIS Vermont Center交涉
5个月,终于完成我的历时22个月的J waiver
22个月我的DS2019延期2次,transfer 1 次.我成了一个多灾多难的难民,多少次我对
于生活,对于人生绝望了。在经历22个月挫折后,我对于人生,对于生活有了重新认识。

【在 m**m 的大作中提到】
: 大家好,昨天查询状态,发现如下:
: No Objection Statement Requested May 28, 2013
: No Objection Statement (Unacceptable) Received May 23, 2013
: Fee Received May 16, 2013
: Form DS-3035 Received May 16, 2013
: Form DS-2019 Received May 16, 2013
: Passport Data Page Received May 16, 2013
: Statement Of Reason Received May 16, 2013
: 这是怎么一回事啊?多谢!
: 现在是一头雾水……

avatar
s*x
7
可以
见上海总领事馆网站
avatar
i*y
8
lol you cai

【在 y****i 的大作中提到】
: 玛雅历法:第四个世界的终结是2012年12月21日。
: 在飞机上发现离自己三排远的位置坐着张柏芝之后,陈冠希沉浸在一种绝望的情绪中难
: 以自拔。他无意识的盯着舷窗,十三岁时发现另外三个陈冠希的场景在眼前浮动。在发
: 现这个事实之后,他常常自信满满,觉得这是一种恩赐,一种在盲人之国中获得视力的
: 荣耀。但当他遭到其他射影师的拒绝之后,2011年5月8日,大限将至,陈冠希第一次觉
: 得这种对世界的知情是一种诅咒。
: 大厦将倾,他却无能为力。陈冠希痛苦的在座位上扭来扭去。我们的世界就要毁灭了。
: 1989年,陈冠希从加拿大来到香港。这是一个留存在别人的描述中陌生的城市,他没有
: 什么朋友,唯一的亲人是他的父亲。但是这个父亲仅仅是某些时光里转瞬出现的一个幻
: 影,他走近的时候,父亲就摆摆手:我很忙。塞给他一些钱,然后变淡,消失在楼梯的

avatar
p*2
9
不知道有啥危险的。
avatar
m*m
10
My god,
请问大家有遇到过这种情况么……
是什么原因呢?
avatar
m*g
11
我擦
冤枉惯吸了,有这么大的责任。
霆疯应该原谅惯吸。
最高贤者放出来,道歉。
avatar
d*r
12
closure accesses external mutable variables 挺危险的... WebStorm 是要报
warning 的呀
我觉得这个理解是对的:
如果想 callback 里的逻辑使用 callback 注册时候的 someObjectRef 的值,岂不是
传入 callback 的时候就得 copy/clone someObjectRef 当时的值?
... ...
这样做的话,就有点像其他 concurrent 模型里面的 "send a variable copy through
a message, but not give reference to the variable".
avatar
s*u
13
你无论如何要于直接处理你的Case 的 VO 联系上,
听听VO 咋办
否则这名VO不批准,你永远无法豁免。不像你被拒签,可以换另外的签证官员。你不可
能换另外的VO
我们学校有位大姐,给Visa Office写信,FAX 10次以上,收到直接处理的VO的Email回
复,她的问题解决了,才能全家豁免,得到绿卡。

【在 m**m 的大作中提到】
: My god,
: 请问大家有遇到过这种情况么……
: 是什么原因呢?

avatar
f*u
14
如果是真的,就原谅柏芝吧。
avatar
p*2
15

through
不用webstorm,为什么你会感觉危险呢?

【在 d*******r 的大作中提到】
: closure accesses external mutable variables 挺危险的... WebStorm 是要报
: warning 的呀
: 我觉得这个理解是对的:
: 如果想 callback 里的逻辑使用 callback 注册时候的 someObjectRef 的值,岂不是
: 传入 callback 的时候就得 copy/clone someObjectRef 当时的值?
: ... ...
: 这样做的话,就有点像其他 concurrent 模型里面的 "send a variable copy through
: a message, but not give reference to the variable".

avatar
m*m
16
多谢shmu!
下午打了202-663-1541, then dial 3,但是一直都是语音。
然后给202-663-2868发了FAX,不知要多久才会有回复……
请问,我不知道具体是哪一位VO,就直接写了DOS Officer, 然后说了case number和遇
到的状况,询问下一步如何办理,这样可以么?
avatar
s*s
17
牛!难道又是马亲王的新作?

【在 y****i 的大作中提到】
: 玛雅历法:第四个世界的终结是2012年12月21日。
: 在飞机上发现离自己三排远的位置坐着张柏芝之后,陈冠希沉浸在一种绝望的情绪中难
: 以自拔。他无意识的盯着舷窗,十三岁时发现另外三个陈冠希的场景在眼前浮动。在发
: 现这个事实之后,他常常自信满满,觉得这是一种恩赐,一种在盲人之国中获得视力的
: 荣耀。但当他遭到其他射影师的拒绝之后,2011年5月8日,大限将至,陈冠希第一次觉
: 得这种对世界的知情是一种诅咒。
: 大厦将倾,他却无能为力。陈冠希痛苦的在座位上扭来扭去。我们的世界就要毁灭了。
: 1989年,陈冠希从加拿大来到香港。这是一个留存在别人的描述中陌生的城市,他没有
: 什么朋友,唯一的亲人是他的父亲。但是这个父亲仅仅是某些时光里转瞬出现的一个幻
: 影,他走近的时候,父亲就摆摆手:我很忙。塞给他一些钱,然后变淡,消失在楼梯的

avatar
d*r
18
二爷你还没仔细读帖子吧,帖子里说的很清楚了呀,而且帖子里面那个例子就是很好的
说明,我copy下来跑过
而且如果你 Google: closure access mutable variable 的话,是有很多其他人的讨
论的

【在 p*****2 的大作中提到】
:
: through
: 不用webstorm,为什么你会感觉危险呢?

avatar
s*u
19
可以,如果不答复,你坚持不断发,找参议员,找第一夫人,坚持下去,
总要解决问题。
这就是人生,这就是生活。
see below post
http://www.mitbbs.com/article_t2/Postdoc/31282425.html

【在 m**m 的大作中提到】
: 多谢shmu!
: 下午打了202-663-1541, then dial 3,但是一直都是语音。
: 然后给202-663-2868发了FAX,不知要多久才会有回复……
: 请问,我不知道具体是哪一位VO,就直接写了DOS Officer, 然后说了case number和遇
: 到的状况,询问下一步如何办理,这样可以么?

avatar
b*2
20
看不懂,真的老了,靠
avatar
p*2
21
你能不能给个例子?那个太长懒得看。我用了这么久没觉得有啥问题。

【在 d*******r 的大作中提到】
: 二爷你还没仔细读帖子吧,帖子里说的很清楚了呀,而且帖子里面那个例子就是很好的
: 说明,我copy下来跑过
: 而且如果你 Google: closure access mutable variable 的话,是有很多其他人的讨
: 论的

avatar
c*t
22
祝福楼主,一定要坚持!

【在 m**m 的大作中提到】
: 多谢shmu!
: 下午打了202-663-1541, then dial 3,但是一直都是语音。
: 然后给202-663-2868发了FAX,不知要多久才会有回复……
: 请问,我不知道具体是哪一位VO,就直接写了DOS Officer, 然后说了case number和遇
: 到的状况,询问下一步如何办理,这样可以么?

avatar
m*e
23
Pretty lame.
avatar
p*2
24
看了一下 这个也太无聊了 你别总看这些没用的了

【在 p*****2 的大作中提到】
: 你能不能给个例子?那个太长懒得看。我用了这么久没觉得有啥问题。
avatar
m*m
25
多谢诸位!
avatar
a*g
26
这是有创意
avatar
d*r
27
我前几天写了一个类似的 bug ...

【在 p*****2 的大作中提到】
: 看了一下 这个也太无聊了 你别总看这些没用的了
avatar
p*2
28
那是你还不懂node

【在 d*******r 的大作中提到】
: 我前几天写了一个类似的 bug ...
avatar
d*r
29
我是 Node 新手呀, 经常在折腾中学习

【在 p*****2 的大作中提到】
: 那是你还不懂node
avatar
p*2
30
所以没必要大惊小怪的 这个是很好理解的
异步吗

【在 d*******r 的大作中提到】
: 我是 Node 新手呀, 经常在折腾中学习
avatar
d*r
31
我是觉得这个理解比较有意思:
如果想 callback 里的逻辑使用 callback 注册时候的 someObjectRef 的值,岂不是
传入 callback 的时候就得 copy/clone someObjectRef 当时的值?
这样做的话,就有点像其他 concurrent 模型里面的 "send a variable copy through
a message, but not give reference to the variable". 也就是说,Node.js 这种
single threaded 的模型,其实也是要隐性处理 issue of accessing shared
variables 的.

【在 p*****2 的大作中提到】
: 所以没必要大惊小怪的 这个是很好理解的
: 异步吗

avatar
p*2
32
完全错误 node的并发不是多线程

through


【在 d*******r 的大作中提到】
: 我是觉得这个理解比较有意思:
: 如果想 callback 里的逻辑使用 callback 注册时候的 someObjectRef 的值,岂不是
: 传入 callback 的时候就得 copy/clone someObjectRef 当时的值?
: 这样做的话,就有点像其他 concurrent 模型里面的 "send a variable copy through
: a message, but not give reference to the variable". 也就是说,Node.js 这种
: single threaded 的模型,其实也是要隐性处理 issue of accessing shared
: variables 的.

avatar
d*r
33
没说多线程呀,帖子说的是 "因为 single threaded 只是可以让 Node 的代码 access
shared variables 时候不用 lock"。都不用 lock 了,所以所谓 "平行执行的
callbacks" 还是在 single threaded 的主 thread 执行的 (可以算是虚拟平行执行)
,这些执行流程 access shared variable 的问题,是说如果那个 shared variable
是 mutable 的话,多个 (虚拟平行执行的) callbacks 可能修改这个 variable 而不
互相通知。
所以用 closure access external mutable variable 才是有可能有危险的。
我觉得 WebStorm 的 warning 还是挺靠谱的。

【在 p*****2 的大作中提到】
: 完全错误 node的并发不是多线程
:
: through
: 种

avatar
p*2
34
我不明白有啥危险的

access

【在 d*******r 的大作中提到】
: 没说多线程呀,帖子说的是 "因为 single threaded 只是可以让 Node 的代码 access
: shared variables 时候不用 lock"。都不用 lock 了,所以所谓 "平行执行的
: callbacks" 还是在 single threaded 的主 thread 执行的 (可以算是虚拟平行执行)
: ,这些执行流程 access shared variable 的问题,是说如果那个 shared variable
: 是 mutable 的话,多个 (虚拟平行执行的) callbacks 可能修改这个 variable 而不
: 互相通知。
: 所以用 closure access external mutable variable 才是有可能有危险的。
: 我觉得 WebStorm 的 warning 还是挺靠谱的。

avatar
h*j
35
没什么危险,你大概是想太多了,是会有可能多个callbacks来修改,但也还是按某个
顺序挨个来的。
javascript历来就是这样,也不是到了node才有的。

access

【在 d*******r 的大作中提到】
: 没说多线程呀,帖子说的是 "因为 single threaded 只是可以让 Node 的代码 access
: shared variables 时候不用 lock"。都不用 lock 了,所以所谓 "平行执行的
: callbacks" 还是在 single threaded 的主 thread 执行的 (可以算是虚拟平行执行)
: ,这些执行流程 access shared variable 的问题,是说如果那个 shared variable
: 是 mutable 的话,多个 (虚拟平行执行的) callbacks 可能修改这个 variable 而不
: 互相通知。
: 所以用 closure access external mutable variable 才是有可能有危险的。
: 我觉得 WebStorm 的 warning 还是挺靠谱的。

avatar
c*l
36
你说的问题,python早就考虑到了
python的闭包,callback 函数只能读闭包的变量,不能写或改变闭包的变量
既然node.js已经这么设计了,你就不用追究node的设计人的设计理念
而是从实用角度出发:既然node.js已经设计成目前样子了,我们应该如何编程,才
能最大化适应node.js
依我看,
1,尽量在node.js中避免使用闭包变量
2,如果需要修改闭包变量,必须上lock

【在 d*******r 的大作中提到】
: 一个帖子,转来大家讨论一下
: 最近使用 closure 和 anonymous function 遇到些问题, 大家探讨一下。
: 简单说就是当临时写一个 closure 或者 anonymous function 当 callback 使用时候
: ,如果让这个 closure access 了 external scope 里面的 variable, 就容易出现 "
: access mutable variable " 的问题 (WebStorm 就会报 warning).
: 比如这个帖子里面描述的例子:
: http://samwize.com/2013/09/01/how-you-can-pass-a-variable-into-
: 里面的 callback 引用并使用了 external scope 里面的 i, 所以出错了。
: 他是通过用 bind( {i: i} ) 将 i 的值传入注册时候的 callback 来解决的,当然也
: 有其他方案, 比如将 dummy(i, function(response)) 改成 dummy(i, function(

avatar
h*j
37
node不需要,也没有lock啊

【在 c********l 的大作中提到】
: 你说的问题,python早就考虑到了
: python的闭包,callback 函数只能读闭包的变量,不能写或改变闭包的变量
: 既然node.js已经这么设计了,你就不用追究node的设计人的设计理念
: 而是从实用角度出发:既然node.js已经设计成目前样子了,我们应该如何编程,才
: 能最大化适应node.js
: 依我看,
: 1,尽量在node.js中避免使用闭包变量
: 2,如果需要修改闭包变量,必须上lock

avatar
p*2
38

上lock?我的世界观要崩溃了。

【在 c********l 的大作中提到】
: 你说的问题,python早就考虑到了
: python的闭包,callback 函数只能读闭包的变量,不能写或改变闭包的变量
: 既然node.js已经这么设计了,你就不用追究node的设计人的设计理念
: 而是从实用角度出发:既然node.js已经设计成目前样子了,我们应该如何编程,才
: 能最大化适应node.js
: 依我看,
: 1,尽量在node.js中避免使用闭包变量
: 2,如果需要修改闭包变量,必须上lock

avatar
c*l
39
我的lock不是指node.js语言本身提供的lock,而是一种广义的lock
多机instance,尤其是load balancer后面多个web server,
若是同时修改同一数据,难道不上lock?
不上lock才要崩溃

【在 p*****2 的大作中提到】
:
: 上lock?我的世界观要崩溃了。

avatar
p*2
40

你太搞了。

【在 c********l 的大作中提到】
: 我的lock不是指node.js语言本身提供的lock,而是一种广义的lock
: 多机instance,尤其是load balancer后面多个web server,
: 若是同时修改同一数据,难道不上lock?
: 不上lock才要崩溃

avatar
d*r
41
我知道是按照某个顺序修改的 (因为 single threaded),但是如果你一段closure函数
里面,正在使用一个变量,但是不确定这个变量的值,那不是很容易写出逻辑错误。这
个确实是JS的老pattern了,网上很多帖子讨论的,我是JS新手,最近才学到。

【在 h**j 的大作中提到】
: 没什么危险,你大概是想太多了,是会有可能多个callbacks来修改,但也还是按某个
: 顺序挨个来的。
: javascript历来就是这样,也不是到了node才有的。
:
: access

avatar
p*2
42
变量的值总是最新的 有啥不确定的? node让并发编程极其容易。

【在 d*******r 的大作中提到】
: 我知道是按照某个顺序修改的 (因为 single threaded),但是如果你一段closure函数
: 里面,正在使用一个变量,但是不确定这个变量的值,那不是很容易写出逻辑错误。这
: 个确实是JS的老pattern了,网上很多帖子讨论的,我是JS新手,最近才学到。

avatar
n*1
43
楼主的担心是很合理的. 说node不用锁,就等于说单核电脑上的代码不用锁一样...
avatar
p*2
44

两码事

【在 n****1 的大作中提到】
: 楼主的担心是很合理的. 说node不用锁,就等于说单核电脑上的代码不用锁一样...
avatar
d*r
45
二爷我没有 bash Node 呀,Node 确实写并发挺方便的,特别是各种 Net/File IO,最
近用着确实挺爽的.
我只是觉得写 JS Closure 的时候,我需要注意这个 access external mutable
variables 的问题。
刚刚扫了一眼 CoffeeScript, Coffee 有个 do 关键词就是跟这个有关.
http://coffeescript.org/
When using a JavaScript loop to generate functions, it's common to insert a
closure wrapper in order to ensure that loop variables are closed over, and
all the generated functions don't just share the final values. CoffeeScript
provides the do keyword, which immediately invokes a passed function,
forwarding any arguments.
这里这个例子比官方那个更详细点
http://rzrsharp.net/2011/06/27/what-does-coffeescripts-do-do.ht

【在 p*****2 的大作中提到】
: 变量的值总是最新的 有啥不确定的? node让并发编程极其容易。
avatar
p*2
46

a
and
CoffeeScript
我感觉你还没有熟悉Node。Node其实挺简单的,就是异步,你这个想明白了,你说的东
西都不是问题了。你现在还用同步的思路想Node,所以纠结。其实根据我的观察,这个
纠结也就是1,2天的事。

【在 d*******r 的大作中提到】
: 二爷我没有 bash Node 呀,Node 确实写并发挺方便的,特别是各种 Net/File IO,最
: 近用着确实挺爽的.
: 我只是觉得写 JS Closure 的时候,我需要注意这个 access external mutable
: variables 的问题。
: 刚刚扫了一眼 CoffeeScript, Coffee 有个 do 关键词就是跟这个有关.
: http://coffeescript.org/
: When using a JavaScript loop to generate functions, it's common to insert a
: closure wrapper in order to ensure that loop variables are closed over, and
: all the generated functions don't just share the final values. CoffeeScript
: provides the do keyword, which immediately invokes a passed function,

avatar
d*r
47
都纠结 2 个多星期了,哈哈
不过总体来说还是觉得 Node 很爽, 而且整个生态圈发展势头太好了

【在 p*****2 的大作中提到】
:
: a
: and
: CoffeeScript
: 我感觉你还没有熟悉Node。Node其实挺简单的,就是异步,你这个想明白了,你说的东
: 西都不是问题了。你现在还用同步的思路想Node,所以纠结。其实根据我的观察,这个
: 纠结也就是1,2天的事。

avatar
p*2
48

这个你慢慢就知道了,好处远远大于你这点迷惑。Node是thread safe的,multi
thread的一堆破问题,在node里你根本没有必要worry。

【在 d*******r 的大作中提到】
: 都纠结 2 个多星期了,哈哈
: 不过总体来说还是觉得 Node 很爽, 而且整个生态圈发展势头太好了

avatar
t*h
49
这是js入门问题啊 应该是学习2,3天后就应该碰到并理解的了 js不是一直就这样吗
异步的 js的scope是function level的 搞一个function closure就完了

【在 d*******r 的大作中提到】
: 一个帖子,转来大家讨论一下
: 最近使用 closure 和 anonymous function 遇到些问题, 大家探讨一下。
: 简单说就是当临时写一个 closure 或者 anonymous function 当 callback 使用时候
: ,如果让这个 closure access 了 external scope 里面的 variable, 就容易出现 "
: access mutable variable " 的问题 (WebStorm 就会报 warning).
: 比如这个帖子里面描述的例子:
: http://samwize.com/2013/09/01/how-you-can-pass-a-variable-into-
: 里面的 callback 引用并使用了 external scope 里面的 i, 所以出错了。
: 他是通过用 bind( {i: i} ) 将 i 的值传入注册时候的 callback 来解决的,当然也
: 有其他方案, 比如将 dummy(i, function(response)) 改成 dummy(i, function(

avatar
p*2
50

终于有大牛过来说句公道话了。2,3天很靠谱呀。我观察了好几个人了,基本就是这个
节奏。

【在 t*********h 的大作中提到】
: 这是js入门问题啊 应该是学习2,3天后就应该碰到并理解的了 js不是一直就这样吗
: 异步的 js的scope是function level的 搞一个function closure就完了

avatar
t*h
51
大牛好 这个确实写任何event handler或者callback就会碰到的 我自己就是初学js就
困惑了 就彻底学习了一下

【在 p*****2 的大作中提到】
:
: 终于有大牛过来说句公道话了。2,3天很靠谱呀。我观察了好几个人了,基本就是这个
: 节奏。

avatar
p*2
52

赞大牛。

【在 t*********h 的大作中提到】
: 大牛好 这个确实写任何event handler或者callback就会碰到的 我自己就是初学js就
: 困惑了 就彻底学习了一下

avatar
d*r
53
这个确实一开始用 JS 就难受着,只是那会儿在折腾糙烂的 webpage 上的 JS,没花时
间来仔细看.
avatar
d*r
54
其实在 Node 出来之前,我就用过这种类似的 single thread 的框架,OpenFlow
Controller 的框架,C/C++ & Python 的, 专门处理 Network IO 的,single
threaded scheduling + event handler。还自带 yield,所以写起 Application 来
,比 Node 还要直白。所以 Node 加入 yield 是在正路上.

【在 p*****2 的大作中提到】
:
: 赞大牛。

avatar
d*r
55
这个才是最有意思的部分,意思是说很多 concurrent 模型本质上是有相似性的,
我 review 了一下整个帖子,发现根本没人讨论这个。这个帖子搞得太无趣了。

through


【在 d*******r 的大作中提到】
: 我是觉得这个理解比较有意思:
: 如果想 callback 里的逻辑使用 callback 注册时候的 someObjectRef 的值,岂不是
: 传入 callback 的时候就得 copy/clone someObjectRef 当时的值?
: 这样做的话,就有点像其他 concurrent 模型里面的 "send a variable copy through
: a message, but not give reference to the variable". 也就是说,Node.js 这种
: single threaded 的模型,其实也是要隐性处理 issue of accessing shared
: variables 的.

avatar
p*2
56
我觉得是错误的 不值得讨论

【在 d*******r 的大作中提到】
: 这个才是最有意思的部分,意思是说很多 concurrent 模型本质上是有相似性的,
: 我 review 了一下整个帖子,发现根本没人讨论这个。这个帖子搞得太无趣了。
:
: through
: 种

avatar
d*r
57
各人保持自己观点吧~~

【在 p*****2 的大作中提到】
: 我觉得是错误的 不值得讨论
avatar
p*2
58

所以没人愿意讨论呀。没有必要争这个。

【在 d*******r 的大作中提到】
: 各人保持自己观点吧~~
avatar
d*k
59
似乎楼主对concurrent问题的理解还不够。
concurrent的问题是thread A在执行时,另一个thread B 跑进来把共享的数据修改了
,那thread A的逻辑就会出问题,比如
thread A:
if (thisGirl.isMarried === false)
{
//threadB 这时跑进来把她娶了
marryHer(); //一女共侍二夫了
}
如果是single thread, 就算是callback在不确定的时间执行这段code, isMarried的值
是不确定,但逻辑完全没有问题,不会有3P的问题存在。
avatar
d*r
60
你太小看楼主了... 你这个是 TA 给 CS10X 补课呢 ...
你仔细看帖了么...

【在 d******k 的大作中提到】
: 似乎楼主对concurrent问题的理解还不够。
: concurrent的问题是thread A在执行时,另一个thread B 跑进来把共享的数据修改了
: ,那thread A的逻辑就会出问题,比如
: thread A:
: if (thisGirl.isMarried === false)
: {
: //threadB 这时跑进来把她娶了
: marryHer(); //一女共侍二夫了
: }
: 如果是single thread, 就算是callback在不确定的时间执行这段code, isMarried的值

avatar
d*k
61
失敬。
或者这么说吧。人有时候会在某个角拐不过弯来,而在别人看来,那里根本就没有角。
这个问题人人都会发生,我自己也会。琢磨琢磨就会想通了。
比如你下面的说法:
>>>我知道是按照某个顺序修改的 (因为 single threaded),但是如果你一段closure
函数
>>> 里面,正在使用一个变量,但是不确定这个变量的值,那不是很容易写出逻辑错误
。这
>>> 个确实是JS的老pattern了,网上很多帖子讨论的,我是JS新手,最近才学到。
你现在认为的角,其实跟Node 没关系,跟closure没关系,跟concurrent也没关系。 而
是对变量的理解。就像Peking2说的,变量的值本来就是变的,本来就是不确定的。何
需担心。

【在 d*******r 的大作中提到】
: 你太小看楼主了... 你这个是 TA 给 CS10X 补课呢 ...
: 你仔细看帖了么...

avatar
p*2
62
靠 这个解释太高了

closure

【在 d******k 的大作中提到】
: 失敬。
: 或者这么说吧。人有时候会在某个角拐不过弯来,而在别人看来,那里根本就没有角。
: 这个问题人人都会发生,我自己也会。琢磨琢磨就会想通了。
: 比如你下面的说法:
: >>>我知道是按照某个顺序修改的 (因为 single threaded),但是如果你一段closure
: 函数
: >>> 里面,正在使用一个变量,但是不确定这个变量的值,那不是很容易写出逻辑错误
: 。这
: >>> 个确实是JS的老pattern了,网上很多帖子讨论的,我是JS新手,最近才学到。
: 你现在认为的角,其实跟Node 没关系,跟closure没关系,跟concurrent也没关系。 而

avatar
d*r
63
其实是这样的,有很多变量本来就是拿来所有 模块/进程/host 共享和修改的,比如故
意全局共享的一些状态,或者 remote 端的 DB 里面的一些值,这个确实对所有语言都
一样。这样的话,在任何一个范围内 (e.g. event handler),你 access 这些变量,
都是可能被别的执行单元 (e.g. event handler) 修改过,对这些修改是有心里准备的。
我说那种,还是属于吴用了 Node, 然后觉得这些变量在某个范围内,是不会修改的,
然后其实被修改了,然后逻辑就出错了。还是跟 Node 有关的。想想主要还是async的
注册/执行 event handler 的时间差造成的。消除这个时间差的一个简便办法,就是注
册 event handler 的时候,就 copy 当时想访问的变量的值。

closure

【在 d******k 的大作中提到】
: 失敬。
: 或者这么说吧。人有时候会在某个角拐不过弯来,而在别人看来,那里根本就没有角。
: 这个问题人人都会发生,我自己也会。琢磨琢磨就会想通了。
: 比如你下面的说法:
: >>>我知道是按照某个顺序修改的 (因为 single threaded),但是如果你一段closure
: 函数
: >>> 里面,正在使用一个变量,但是不确定这个变量的值,那不是很容易写出逻辑错误
: 。这
: >>> 个确实是JS的老pattern了,网上很多帖子讨论的,我是JS新手,最近才学到。
: 你现在认为的角,其实跟Node 没关系,跟closure没关系,跟concurrent也没关系。 而

avatar
h*j
64
大牛开始搞c*了么 等你分享心得呢

的。

【在 d*******r 的大作中提到】
: 其实是这样的,有很多变量本来就是拿来所有 模块/进程/host 共享和修改的,比如故
: 意全局共享的一些状态,或者 remote 端的 DB 里面的一些值,这个确实对所有语言都
: 一样。这样的话,在任何一个范围内 (e.g. event handler),你 access 这些变量,
: 都是可能被别的执行单元 (e.g. event handler) 修改过,对这些修改是有心里准备的。
: 我说那种,还是属于吴用了 Node, 然后觉得这些变量在某个范围内,是不会修改的,
: 然后其实被修改了,然后逻辑就出错了。还是跟 Node 有关的。想想主要还是async的
: 注册/执行 event handler 的时间差造成的。消除这个时间差的一个简便办法,就是注
: 册 event handler 的时候,就 copy 当时想访问的变量的值。
:
: closure

avatar
d*r
66
还没... 还在折腾 mongo...
看二爷有啥新见解没?

【在 h**j 的大作中提到】
: 大牛开始搞c*了么 等你分享心得呢
:
: 的。

avatar
p*2
67
社区真不错

【在 d*******r 的大作中提到】
: 还没... 还在折腾 mongo...
: 看二爷有啥新见解没?

avatar
c*e
68
可以存在一个queue里,先进先出,每次pop出去一个。

【在 d*******r 的大作中提到】
: 一个帖子,转来大家讨论一下
: 最近使用 closure 和 anonymous function 遇到些问题, 大家探讨一下。
: 简单说就是当临时写一个 closure 或者 anonymous function 当 callback 使用时候
: ,如果让这个 closure access 了 external scope 里面的 variable, 就容易出现 "
: access mutable variable " 的问题 (WebStorm 就会报 warning).
: 比如这个帖子里面描述的例子:
: http://samwize.com/2013/09/01/how-you-can-pass-a-variable-into-
: 里面的 callback 引用并使用了 external scope 里面的 i, 所以出错了。
: 他是通过用 bind( {i: i} ) 将 i 的值传入注册时候的 callback 来解决的,当然也
: 有其他方案, 比如将 dummy(i, function(response)) 改成 dummy(i, function(

avatar
d*r
69
我去, 怎么想起挖这个坟 :D

【在 c*********e 的大作中提到】
: 可以存在一个queue里,先进先出,每次pop出去一个。
avatar
c*e
70
消除这个时间差的一个简便办法,也可以用hashtable啊。现在hashtable太热了,什么
map-reduce, nosql都是用的它。

的。

【在 d*******r 的大作中提到】
: 其实是这样的,有很多变量本来就是拿来所有 模块/进程/host 共享和修改的,比如故
: 意全局共享的一些状态,或者 remote 端的 DB 里面的一些值,这个确实对所有语言都
: 一样。这样的话,在任何一个范围内 (e.g. event handler),你 access 这些变量,
: 都是可能被别的执行单元 (e.g. event handler) 修改过,对这些修改是有心里准备的。
: 我说那种,还是属于吴用了 Node, 然后觉得这些变量在某个范围内,是不会修改的,
: 然后其实被修改了,然后逻辑就出错了。还是跟 Node 有关的。想想主要还是async的
: 注册/执行 event handler 的时间差造成的。消除这个时间差的一个简便办法,就是注
: 册 event handler 的时候,就 copy 当时想访问的变量的值。
:
: closure

avatar
d*r
71
申明闭包时候, copy 原值传入就是, 跟用什么数据结构无关

【在 c*********e 的大作中提到】
: 消除这个时间差的一个简便办法,也可以用hashtable啊。现在hashtable太热了,什么
: map-reduce, nosql都是用的它。
:
: 的。

avatar
b*0
72
经典问题 下面这个文章里有讨论
http://book.mixu.net/node/ch4.html
你的帖子里 那个人没搞清楚 例子里根本没有closure
所以和mutable closure没啥关系

【在 d*******r 的大作中提到】
: 一个帖子,转来大家讨论一下
: 最近使用 closure 和 anonymous function 遇到些问题, 大家探讨一下。
: 简单说就是当临时写一个 closure 或者 anonymous function 当 callback 使用时候
: ,如果让这个 closure access 了 external scope 里面的 variable, 就容易出现 "
: access mutable variable " 的问题 (WebStorm 就会报 warning).
: 比如这个帖子里面描述的例子:
: http://samwize.com/2013/09/01/how-you-can-pass-a-variable-into-
: 里面的 callback 引用并使用了 external scope 里面的 i, 所以出错了。
: 他是通过用 bind( {i: i} ) 将 i 的值传入注册时候的 callback 来解决的,当然也
: 有其他方案, 比如将 dummy(i, function(response)) 改成 dummy(i, function(

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。