setTimeout()。Js的伪多线程

首先为什么说setTimeout()是多线程。因为我在顺序执行流程的时候,我可以把一部分耗时间,但又不需要及时处理的代码放到setTimeout()中去执行。即空闲时间去执行。为什么说是空闲时间呢。可以写一个小dome测试一下。



#1那里耗了100ms.setTimeout()是50ms.如果是严格的50ms后执行应该在循环里就执行了。但实际结果是先执行的#2。

以下是执行结果。

687fininsh671

687-671=16.这说明。setTimeout()当时就开始计时了。当时间到了的时候并不是马上执行。而是看有没有其它操作。在确定没有其它操作后才真正的执行代码的。这样就可以把一些耗时间的操作放到空闲时处理,以提高代码效率。

为什么说setTimeout是伪多线程呢。是因为实际还是单线程操作的。再看下一个demo




由于#2基本上不耗时间。write()故意耗掉100ms.

执行结果:

15in953125

执行流程是#1计时开始。#2执行。#3计时开始。#1时间到。发现是空余时间,执行。#1执行过程中,#3时间到。(如果确实是多线程,这时候#3应该也要开始执行了。)实际上。#3发现有代码在执行,等待,直到#1执行完。#3开始执行。可见#1,#3的时间差应该就是一个write()耗的时间数。125-15=110也说明了确实是这样。

用setTimeout的好处就是把代码扔到了空余时间处理。这在处理并发问题时很有用。假设这样一种应用。我服务器往客户端抛数据。客户端接受数据时马上处理。如果服务器是每1ms抛一条数据。而js处理这条数据要两2ms.显然会有数据的丢失,或称为数据淹没。光是这种应用就会丢失50%的数据。事实上如果js处理数据是往DOM上加结点的话。js的耗时会越来越多,越往后丢失的数据越多。处理这种问题就是应用setTimeout().数据来时,我直接抛走。真正的执行是在空闲时间再做。这样就不会有数据丢失了!

现在在做的NBA体育文字直播之前没有用settimeout。所以出现了数据丢失的问题。一百多个用户。实际只处理了30来位。丢失了70%。现在改为setTimeout来做。效果如何,我也试目以待。

Tags: