NodeJS和Redis都是单线程实现高并发的典型例子,我的小项目正需要借鉴这种以事件循环为主的调度方式。
首先承认参考的文章没完全看懂,特别是后半部分讲timeout的部分。不清楚与我的关注点是否有重要联系。
我的关注点在于上下文切换问题,NodeJS高效解决了事件——确切说是一次性事件的处理,一个事件轮到它就一次性处理完然后就不用再管了。
这种设计要求事件本身是粒度比较细的,比如对某种资源的访问,get()。
但我设计的小系统针对的是需要长时间运行且IO负担大的多并行任务,这更接近“线程”甚至“进程”的模型。比如多个声源一起进入耳机,既要进行除噪,同时要进行傅里叶变换级别的处理,还要与其他系统进行超低延迟的数据通信。
但这个小工具所设定的是单核CPU模型。如果有多核或者更先进的技术(比如内存-忆阻器符合体),在数据并发层面应该交给更底层的工具比如实时编译/解释器去实现。
正因为上下文切换的沉重成本,我希望使用事件循环等轻量技术;但如果任务客观上更接近线程甚至进程,我一方面面临对任务本身进行“事件化”转化的技术挑战(接口、编程语言、状态控制等等),另一方面面临重现上下文切换的负担。
向量处理器、超标量、超长指令字、超线程,这些技术非常底层,奔腾4的技术(而非商业)失败影响深远。而且据我了解在高级语言层面探索还非常有限。我是很想试一试的,比如一个脑洞:
借鉴分数微积分的思想,运行对程序片段(在一定范围内)进行任意粒度分割,运行“对象”的重组包括拆分、合并、转换类型。比如事件队列中某时刻正在处理的是1/3的对象A和1/2的对象B,2/3的对象A和1/4的对象C轮到下一次“执行空间”来完成,1/2对象B跟1/4对象C再结合。。。
粗浅的想法是:1定义事件/操作子原型的接口 2提供最小和/或可分割操作单元的原型。这对一些基本的信号处理算法比较合适,但复杂度高一点儿就很难了。
参考:
Nodejs探秘:深入理解单线程实现高并发原理 https://imweb.io/topic/5b6cf97093759a0e51c917c8
https://en.wikipedia.org/wiki/Context_switch