Lua的协程可以用来取代状态机,因为协程可以把诸多状态函数合并成一个,在编写和阅读上,
使用了协程以后,状态机已经退化成一个函数.
我在一个大型的MMOG中用Lua构建了一个NPC AI框架,
供策划编写脚本.
对于协程能不能取代线程,我想,是不可以的.
首先,系统级线程或者进程最大的好处是把所有的阻塞操作非阻塞化了.(站在系统的角度来看)
如果用协程必然要求全部使用非阻塞的系统调用.否则,一个协程停下来,其他的协程也就不能跑了.
也就是说,如果一个系统中,所有的函数调用,如果没有返回的原因只可能是CPU算不过来,那么在单核情况下是可以用协程替代线程的.
(SMP就有点不合算了 )
说到底,是因为,CPU数量和资源的限制,以及自然界无穷并发性之间的矛盾.
这个矛盾必然需要在做系统映射的时候有一个n:m的比例.实际完成这个映射的方法很多.
Intel 曾经作过一种叫网络处理器的芯片,其 8+1一个9个核心,64+1个硬件线程的架构就是期望通过增加CPU资源来缓解这个矛盾的一次尝
试.
像在Erlang/OTP系统中,Erlang提供了用户态的超轻量级进程和m:n(用户进程:系统进程)的映射模型.
Erlang的用户态进程的数量可以到达100K级别.
在这种情况下,直接把外部并发源(用户的链接)一对一映射到用户态进程是最简单的方案.
在爱立信的很多系统中就是这样做的.
在早年的BBS/UNIX平台上,人们就使用过fork/accept模型通过系统级进程来处理用户连接.结果因为,系统开销大,而另觅他法.
当然,写的好的话,这种模型的系统,像KBS / smth ,也可以在单机上到 10K 连接的级别.
On Jan 29, 2:33 pm, joinhack <
joinh...@gmail.com> wrote:
> 如题