由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - Node.js 并发模型相关:closure 中 access mutable variable
相关主题
node callback的误解没学过php/python/ruby任何一种后台语言,直接上node吃力吗?
用了一下node.js, 看来js要一同天下啊,只要那些人node的callback那么恶心,怎么会火,百思不得其解啊
关于闭包,我发明了一个绝妙陷阱多线程,异步,并发冲突,fp和其它
学了这么多语言发现还是coffeescript最好用Farewell NodeJs
2013年tiobe的变化用node怎么把多个mysql query 的结果合起来
CoffeeScript, TypeScript 能否在将来顶替 JavaScript?node 求算法
感觉c挺有一丝的嘛第一个go项目快上线了
我来说说go的目标对手吧腾讯开源tcp ip stack, f-stack。有用过的么?
相关话题的讨论汇总
话题: callback话题: closure话题: node话题: variable
进入Programming版参与讨论
1 (共1页)
d*******r
发帖数: 3299
1
一个帖子,转来大家讨论一下
最近使用 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 位置.
大家怎么看这个问题.
p*****2
发帖数: 21240
2
不知道有啥危险的。
d*******r
发帖数: 3299
3
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".
p*****2
发帖数: 21240
4

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".

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

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

p*****2
发帖数: 21240
6
你能不能给个例子?那个太长懒得看。我用了这么久没觉得有啥问题。

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

p*****2
发帖数: 21240
7
看了一下 这个也太无聊了 你别总看这些没用的了

【在 p*****2 的大作中提到】
: 你能不能给个例子?那个太长懒得看。我用了这么久没觉得有啥问题。
d*******r
发帖数: 3299
8
我前几天写了一个类似的 bug ...

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

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

【在 p*****2 的大作中提到】
: 那是你还不懂node
相关主题
CoffeeScript, TypeScript 能否在将来顶替 JavaScript?没学过php/python/ruby任何一种后台语言,直接上node吃力吗?
感觉c挺有一丝的嘛node的callback那么恶心,怎么会火,百思不得其解啊
我来说说go的目标对手吧多线程,异步,并发冲突,fp和其它
进入Programming版参与讨论
p*****2
发帖数: 21240
11
所以没必要大惊小怪的 这个是很好理解的
异步吗

【在 d*******r 的大作中提到】
: 我是 Node 新手呀, 经常在折腾中学习
d*******r
发帖数: 3299
12
我是觉得这个理解比较有意思:
如果想 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 的大作中提到】
: 所以没必要大惊小怪的 这个是很好理解的
: 异步吗

p*****2
发帖数: 21240
13
完全错误 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 的.

d*******r
发帖数: 3299
14
没说多线程呀,帖子说的是 "因为 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
: 种

p*****2
发帖数: 21240
15
我不明白有啥危险的

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 还是挺靠谱的。

h**j
发帖数: 2033
16
没什么危险,你大概是想太多了,是会有可能多个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 还是挺靠谱的。

c********l
发帖数: 8138
17
你说的问题,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(

h**j
发帖数: 2033
18
node不需要,也没有lock啊

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

p*****2
发帖数: 21240
19

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

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

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

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

相关主题
Farewell NodeJs第一个go项目快上线了
用node怎么把多个mysql query 的结果合起来腾讯开源tcp ip stack, f-stack。有用过的么?
node 求算法对 (im)mutability 的误解和深度理解
进入Programming版参与讨论
p*****2
发帖数: 21240
21

你太搞了。

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

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

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

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

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

n****1
发帖数: 1136
24
楼主的担心是很合理的. 说node不用锁,就等于说单核电脑上的代码不用锁一样...
p*****2
发帖数: 21240
25

两码事

【在 n****1 的大作中提到】
: 楼主的担心是很合理的. 说node不用锁,就等于说单核电脑上的代码不用锁一样...
d*******r
发帖数: 3299
26
二爷我没有 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让并发编程极其容易。
p*****2
发帖数: 21240
27

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,

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

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

p*****2
发帖数: 21240
29

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

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

t*********h
发帖数: 941
30
这是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(

相关主题
同步编程真郁闷用了一下node.js, 看来js要一同天下啊,只要那些人
尼玛 callback 真是反人类关于闭包,我发明了一个绝妙陷阱
node callback的误解学了这么多语言发现还是coffeescript最好用
进入Programming版参与讨论
p*****2
发帖数: 21240
31

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

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

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

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

p*****2
发帖数: 21240
33

赞大牛。

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

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

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

d*******r
发帖数: 3299
36
这个才是最有意思的部分,意思是说很多 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 的.

p*****2
发帖数: 21240
37
我觉得是错误的 不值得讨论

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

d*******r
发帖数: 3299
38
各人保持自己观点吧~~

【在 p*****2 的大作中提到】
: 我觉得是错误的 不值得讨论
p*****2
发帖数: 21240
39

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

【在 d*******r 的大作中提到】
: 各人保持自己观点吧~~
d******k
发帖数: 28
40
似乎楼主对concurrent问题的理解还不够。
concurrent的问题是thread A在执行时,另一个thread B 跑进来把共享的数据修改了
,那thread A的逻辑就会出问题,比如
thread A:
if (thisGirl.isMarried === false)
{
//threadB 这时跑进来把她娶了
marryHer(); //一女共侍二夫了
}
如果是single thread, 就算是callback在不确定的时间执行这段code, isMarried的值
是不确定,但逻辑完全没有问题,不会有3P的问题存在。
相关主题
学了这么多语言发现还是coffeescript最好用感觉c挺有一丝的嘛
2013年tiobe的变化我来说说go的目标对手吧
CoffeeScript, TypeScript 能否在将来顶替 JavaScript?没学过php/python/ruby任何一种后台语言,直接上node吃力吗?
进入Programming版参与讨论
d*******r
发帖数: 3299
41
你太小看楼主了... 你这个是 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的值

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

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

p*****2
发帖数: 21240
43
靠 这个解释太高了

closure

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

d*******r
发帖数: 3299
44
其实是这样的,有很多变量本来就是拿来所有 模块/进程/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也没关系。 而

h**j
发帖数: 2033
45
大牛开始搞c*了么 等你分享心得呢

的。

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

d******k
发帖数: 28
46
误理解closure中抓到的变量, 有可能。
我另发一帖,应该对理解closure有帮助:
http://www.mitbbs.com/article_t/Programming/31347469.html
d*******r
发帖数: 3299
47
还没... 还在折腾 mongo...
看二爷有啥新见解没?

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

p*****2
发帖数: 21240
48
社区真不错

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

c*********e
发帖数: 16335
49
可以存在一个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(

d*******r
发帖数: 3299
50
我去, 怎么想起挖这个坟 :D

【在 c*********e 的大作中提到】
: 可以存在一个queue里,先进先出,每次pop出去一个。
相关主题
node的callback那么恶心,怎么会火,百思不得其解啊用node怎么把多个mysql query 的结果合起来
多线程,异步,并发冲突,fp和其它node 求算法
Farewell NodeJs第一个go项目快上线了
进入Programming版参与讨论
c*********e
发帖数: 16335
51
消除这个时间差的一个简便办法,也可以用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

d*******r
发帖数: 3299
52
申明闭包时候, copy 原值传入就是, 跟用什么数据结构无关

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

b********0
发帖数: 62
53
经典问题 下面这个文章里有讨论
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(

1 (共1页)
进入Programming版参与讨论
相关主题
腾讯开源tcp ip stack, f-stack。有用过的么?2013年tiobe的变化
对 (im)mutability 的误解和深度理解CoffeeScript, TypeScript 能否在将来顶替 JavaScript?
同步编程真郁闷感觉c挺有一丝的嘛
尼玛 callback 真是反人类我来说说go的目标对手吧
node callback的误解没学过php/python/ruby任何一种后台语言,直接上node吃力吗?
用了一下node.js, 看来js要一同天下啊,只要那些人node的callback那么恶心,怎么会火,百思不得其解啊
关于闭包,我发明了一个绝妙陷阱多线程,异步,并发冲突,fp和其它
学了这么多语言发现还是coffeescript最好用Farewell NodeJs
相关话题的讨论汇总
话题: callback话题: closure话题: node话题: variable