中国电信将规模商用5G独立组网
|
Event loop中要做的事情其实是非常简单的,只需要等待event的带来,然后调用相应的event处理函数即可。 注意,这段代码只需要运行在一个线程或者进程中,只需要这一个event loop就可以同时处理多个用户请求。 有的同学可以依然不明白为什么这样一个event loop可以同时处理多个请求呢?
原因很简单,对于web服务器来说,处理一个用户请求时大部分时间其实都用在了I/O操作上,像数据库读写、文件读写、网络读写等。当一个请求到来,简单处理之后可能就需要查询数据库等I/O操作,我们知道I/O是非常慢的,当发起I/O后我们大可以不用等待该I/O操作完成就可以继续处理接下来的用户请求。 但线程就是完美的、包治百病的吗,显然,计算机世界从来没有那么简单。 由于线程共享进程地址空间,这在为线程间通信带来便利的同时也带来了无尽的麻烦。 正是由于线程间共享地址空间,因此一个线程崩溃会导致整个进程崩溃退出,同时线程间通信简直太简单了,简单到线程间通信只需要直接读取内存就可以了,也简单到出现问题也极其容易,死锁、线程间的同步互斥、等等,这些极容易产生bug,无数程序员宝贵的时间就有相当一部分用来解决多线程带来的无尽问题。 虽然线程也有缺点,但是相比多进程来说,线程更有优势,但想单纯的利用多线程就能解决高并发问题也是不切实际的。 因为虽然线程创建开销相比进程小,但依然也是有开销的,对于动辄数万数十万的链接的高并发服务器来说,创建数万个线程会有性能问题,这包括内存占用、线程间切换,也就是调度的开销。 因此,我们需要进一步思考。 Event Loop:事件驱动 到目前为止,我们提到“并行”二字就会想到进程、线程。但是,并行编程只能依赖这两项技术吗,并不是这样的。 还有另一项并行技术广泛应用在GUI编程以及服务器编程中,这就是近几年非常流行的事件驱动编程,event-based concurrency。 大家不要觉得这是一项很难懂的技术,实际上事件驱动编程原理上非常简单。 这一技术需要两种原料:
剩下的就简单了:
你只需要安静的等待event到来就好,当event到来之后,检查一下event的类型,并根据该类型找到对应的event处理函数,也就是event handler,然后直接调用该event handler就好了。 幸好,除了进程,我们还有线程。 多线程 不是创建进程开销大吗?不是进程间通信困难吗?这些对于线程来说统统不是问题。 什么?你还不了解线程,赶紧看看这篇《看完这篇还不懂线程与线程池你来打我》,这里详细讲解了线程这个概念是怎么来的。 由于线程共享进程地址空间,因此线程间通信天然不需要借助任何通信机制,直接读取内存就好了。 线程创建销毁的开销也变小了,要知道线程就像寄居蟹一样,房子(地址空间)都是进程的,自己只是一个租客,因此非常的轻量级,创建销毁的开销也非常小。
我们可以为每个请求创建一个线程,即使一个线程因执行I/O操作——比如读取数据库等——被阻塞暂停运行也不会影响到其它线程,就像这样: (编辑:平顶山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


