12
回答
有多少开发工作直接使用到并发编程
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

经常在许多招聘要求中看到:掌握高并发、多线程编程。可我从事编程8年了,实际工作中,直接使用JDK原生并发库来处理问题和编程的情况少得可怜。并发的理论原理知识倒是掌握了不少。但也就是纸上谈兵,平时要么做业务编程,要么做系统架构。都跟并发编程沾不上边。并发部分都由相应的开源容器完成了。

虽然我自己实际动手写并发程序的情况很少,但理论知识很明白。也知道,并发这玩意儿涉及操作系统、网络、CPU等诸多底层运行原理,非千日之功不可破也,当然是选用开源的容器好啦。自己去开发一套,得踩多少坑,花多少时间才能稿出一个勉强可用的产品。走完这个过程,开发人员的水平倒是提升了,可老板等得花都谢了,他会同意这么去干吗?都在说不要重复造轮子。可并发这东西,你不重复造一遍轮子,又如何能实际掌握并精通呢?

既然如此,我就想问问各位同行,大家都是从事互联网开发,这行要求的就是快速迭代,上线,争取市场。已经有的成熟的产品,老板那有那么多时间让你去搞低层技术攻关,再造一遍轮子?到底是我的视野有限,是井底之蛙呢,还是真的没多少人会这东西,那些个招聘要求也只不过都是在装X?

<无标签>
举报
艾皮狗
发帖于9个月前 12回/477阅
共有12个回帖 最后回答: 8个月前

多用户改变一个数据的时候就必须用到了,比如游戏中玩家的公会,公会多个成员改变公会总贡献度的时候,有可能并发同时改变。

哈, 巧了,今天刚忙这个事情。我的个人理解,技术只是技术,要看是否有需求,没需求的技术,再高大上都是shit。所以你的问题实际应当等同于,你忙啥会可能碰到并发的设计。以我个人忙的东西,我举例一下,这个算是个并发。

我现在忙的自控系统,至少包括采集、分析决策、执行,三个环节吧。采集和执行,这个是需要驱动外部设备,要么收数据,要么打数据。依据外部设备的特性和处理机制,他们需要定期工作。 简单说,例如我们驱动一个led灯,输出1,就是亮,输出0就是不亮。 如果希望周期闪烁,比如亮300ms,灭500ms后再亮300ms...(这个效果和亮1000ms,灭1000ms肯定不一样)。

简单的书本实现方式,就是在main里面一个大while 循环,中间加delay。

而我的做法是,有个定时器,周期中断,然后调度各种函数。简单说,就是负责led输出的模块,每隔10ms(举例而已,貌似目前设的是20ms)调度一次,如果需要 亮300ms,灭500ms,只需要向这个模块写如亮30,灭50的这个数据,而该模块自身被调用时,点亮并计数(被调度了)30次后,灭,再计数。没达到计数时,直接就退出这个模块的工作。

这样的做法等同于,led的模块,周期自己在处理对外的亮灯机制,而系统其他处理工作和他并不同步,需要决定怎么亮,只要给这个模块打个,亮多少ms,灭多少ms的数据就行了。这个模块自己会周期处理。

同样的,采集、输出有很多模块,可以简单称为面向硬件的模块。每个模块都可以看作“进程”,而被定时器实时调用(这个定时器我在系统里设置的响应优先级很高)。

对应的还有一个定时器的优先级低一些,是定期调度一些软算法的模块。软算法的模块例如,定期检测那些面向硬件的模块是否有新的数据,有就进行分析,没有就不做工作。分析后,对应把要驱动/执行的工作,以数据的方式,打给上面那些面向硬件的“进程”,而后者根据自己的调度周期,去执行这些任务命令。因为有些分析工作是100ms或秒级别的,对应计算工作也会比较长,如果它处理完才去处理执行模块或采集模块,会影响一些外部设备。所以分成两类进程来实现。一次软分析过程中,可能被“实时进程”打断过几次,打断中去处理面向硬件的模块周期的工作。而实际上main函数里面,子函数的处理,是另一个进程,主要处理系统工作模式的调整,和具体工作模式中状态机的工作,不同模式的不同状态下,系统内部协调机理有差异,则可以通过修正函数指针,去调整软分析的算法模块,通过设置数据,去关闭/打开那些面向硬件的模块,这个优先级最高,当然走一圈,睡10ms,等同于自身被挂起。

上述的机制是个简单的实时操作系统的工作。这些定时器和每个模块周期的调度,类似进程管理。无非更强调周期性,不考虑啥动态优先级。你说高大上吗?我不觉得,其实原理没那么复杂。为啥要做?我只能说一句,“那些瞎掰呼这个,那个实时操作系统好的人,最好是真把这些操作系统完全吃透,再推荐给我”。因为我要结合系统设计特点去改动内在东西。所以不得不自己做。

等到啥业务,驱动你,不得不自己做的时候你就知道,虽然都是轮子,自行车的轮子是安装不到卡车上用的。哈。人类最伟大的发明就是轮子。但是轮子多了去了。哪有某个轮子可以到处用的?哈

最后补充一句话,不到万不得已,不要用啥“高大上”的技术。就我现在的深刻感悟,越简单的实现机理,通常是越有效的。真正体现技术水平的,是同样的目标下,如何把系统设计的更简单,而不是如何去实现更复杂的系统。

--- 共有 2 条评论 ---
艾皮狗兄弟辛苦了,打了这么多字,我感觉收获最多的应该是你自己喔:总结归纳了你的工作。个人最欣赏你最后的总结:把系统做简单才是最好的技术 9个月前 回复
张金富打这么多字 给个赞! 9个月前 回复

做项目是为了快速解决问题,你说的都是站在做项目的角度的。

打磨产品就是另一回事,jetty基本没有第三方依赖全部自造,netty基本没有第三方依赖全部自造,基本可以看出,高质量的产品有一个必然的特性,就是不过度依赖第三方的东西,因为自己写的东西,质量自己负责,别人写的东西,自己无法负责。

高并发一般体现在路由层,写业务逻辑的单线程处理最好,调试方便,需要掌握高并发的人也没几个。高并发也是比较模糊的,到底多高算高也没准确定义,关键要支持分布,只不过是什么程度加机器。

正所谓,术业有专攻,只要你专门去做一件事懂了他的架构体系,就可以把这种事儿迁移到另外一种需要学习的体系架构中去;这一点是人工智能尚未突破的一点,俗称,经验迁移,这个太可怕了。前段时间一个“组织机构”被迁移进另外一个分支组织机构,涉及到的业务改动是巨大的,很多影藏的,我负责查找所有影响的代码,这是潜在的,非常地难,源代码中,存储过程中,触发器中,幸好我用了ORACLE搜索文本的方式。非常快就完成了搜索。专门去研究还是有方法的,不然你还不知道如何下手,其实select * from dba_source text like;  这只是一个索引,所以,可以相信,你也可以做好那些DBA才能做好的事,只要你啃完成一件事情,由你负责,这个是最好的驱动,大脑平时不愿意花成本去做将来可能有用的事儿,大脑只对特别有用的事儿感兴趣、除非你是负责或被迫。

顶部