node.js有没有类似给方法加锁的东西?
发布于 3 天前 作者 hvick 439 次浏览 来自 问答

举个例子,A.js里有个a方法,B.js和C.js都调用A里面的a方法,单线程执行,假设现在B先调用a,但是a还没执行完,然后切换到C要开始调用a,如何保证只有在B执行完a后,C才能调用a

29 回复

你学java的吧,实际上,本质上,要锁的东西是资源,而不是方法

呃这个怎么会想到要加锁呢?明显应该是执行顺序流程控制的问题啊

@captainblue2013 对,我原来是java的,现在学node,在弄邮箱和微信,access_token想全局缓存,即第一次http请求获取后,在缓存失效前全部都用缓存,现在第一次还没请求完,第二次请求都发出去了,然后access_token被刷新了,直接地想到锁住获取access_token的方法,思维还没转过来,有什么好的办法?

@klausgao 做http请求的access_token全局缓存,习惯以前的同步思维了。

同一时刻b、c方法中的a一定不会都在执行吧?

@guojinlong B调用a执行到一半,然后线程切换到C调用执行a,时间上来说不可能同时执行,但是B和C都调用a了,想在直到B调用执行完a,B以外的js才能调用a

我理解一下,可能说的不对。欢迎指出。 你说的线程应该主线程吧?那么主线程调用的方法中如果你没有写yield、await。那么他们一定是等方法执行完了才会切换的。 如果你在a()中写了yield,那么是否是写法不恰当?

@guojinlong 严格来说不能叫切换,应该是执行下一个回调。

@guojinlong 没有用yield、await哈,只是普通代码,a方法就是一个判断缓存过期,过期就发起http请求更新缓存的方法,只是想要一个单例缓存

@hvick 那node是单线程执行,应该不会遇到你说的问题吧。。。

@guojinlong 因为a方法里有http请求,比如B调用a的时候,缓存过期了,然后发起http请求,还没执行回调,然后到C调用a,因为B的http回调还没执行,缓存还没更新,所以C也发起http请求,接着B的http请求回调执行了,把缓存更新了一次,【然后C的http请求回调又把缓存更新了】。我的目的是缓存过期只需更新一次。

我想到一个简单方法,就是你在你的c方法中http请求不要用回调方式。就是同步的写法。这样你就不用判断了。哈哈。。。

@hvick 或者你回调函数中,也先判断一下缓存是否有值,如果有值你就舍弃当前请求的值,或者你自己选择用哪个缓存。这样不知道行不行?

js本身就是单线程的,A方法没执行完,是不会执行B方法的,除非有异步ajax调用

@guojinlong 回调里判断,貌似可行,我试试,谢谢

@151263 目前就是因为a里有http的请求回调,所以有这个问题

@hvick B外面放一个变量,是否正在执行B方法isRunning, C检测只有isRunning变量为false时,才能继续执行,否则直接return

@151263 不建议使用判断方式。其实node提倡就是不要用加锁什么之类的判断。当然这种提倡是我自己觉着的。。。

@151263 将异步回调换成同步,或者使用纤程阻塞不知道行不行

单线程 不需要加锁呀。。。

echo 单线程 不需要加锁呀。。。

nodejs 是单线程的,多进程的,准确的说提供给coder的是只能单线程编程,但是nodejs内部的实现是多线程的。 其实应该多考虑使用回调或者多进程。

@yuanbu2 利用回调实现基于http请求的全局单例缓存,还没想到好的解决方法,看来只能参考下现在流行的node微信或者邮箱开发框架了,看看别人怎么解决的。

@hvick 恩 我也接触node不久 也就一年。 这方面有什么好的解决办法分享一下啊。

可以在结构中使用一个有限自动状态机,考虑loading,success,failed 完整请求过程中在这三个状态之间转换 From Noder

这个问题貌似java里也不好做吧?假如有多台服务器怎么锁?锁不住吧?我觉得应该吧accesstoken全局缓存,起服务去刷新accesstoken

@yuanbu2 我才几个月,才刚学习基础模块和玩了下express

@wssgcg1213 状态机得要能在多个js之间共享也是个问题

@xupeng086 java一台的话就好弄,写个单例就可以了,多台的话个人做法选一台出来专门提供这个全局缓存的服务。现在我用node弄全局缓存就是卡在缓存要刷新的时候要使用access_token的js(2个以上)发起http请求的回调把access_token多次刷新了。

回到顶部