PHP 和 Node.js 的角摔 已翻译 100%

oschina 投递于 2015/07/09 17:52 (共 18 段, 翻译完成于 08-04)
阅读 10034
收藏 47
1
加载中

在最近 SitePoint 的 PHP vs Node.js Smackdown 一文中,Craig Buckler 对两种语言就如何应对一系列的10个挑战进行了比较来决定哪一个总体上更佳。

Craig 在书中讲到,这些比较总是有些矛盾。作为一个有意思的随访,我们要求 Bruno Škvorc (SitePoint 的 PHP 开发者)和 James Hibbard (SitePoint 的一个 JavaScript 开发者)对每一轮提供评论。

下面是他们详细的看法...




无名利
无名利
翻译于 2015/07/16 13:36
1

第一轮:开始

Round 1 挑战是看你用每种语言多快可以构建一个“Hello World”的页面。这个包括搭建服务器环境所花的时间。

据 Craig 估计,PHP 赢得这一轮,部分原因是因为这种语言“概念上更简单”,并且“对于新的开发者来说不那么吓人”。

Bruno:

PHP 赢得"开始"这一轮纯粹是因为更多的主机支持这种语言因此开始非常简单。这是拿来就好用了而不需要做额外的事情。如果更多的主机忽略使用 Node 命令行而直接采用文件上传的方式,并且在控制面板上用一个简单的 "reload app" 键,那么两者将会一样。然而就在屏幕上显示东西的实际语法而言,PHP 是更简单些——特别是对那些没有编程经验的人而言。

James:

当在本地机器上开发的时候,我没有在两者之间看到很大的不同。在你的浏览器上运行 PHP 脚本,你需要安装一些服务器软件;要运行 Node 脚本,你需要安装 Node, 并且最好安装一个 web 框架比如express. 然而,正如 Craig 说的, PHP“概念上更简单”.Node 的进入门槛更高。对此没有争议。

无名利
无名利
翻译于 2015/07/16 13:54
2

第二轮: 帮助和支持

第二轮会考量在两种语言中,获得帮助和支持的难易程度。PHP赢得了这一轮,主要因为它出现的更久一些。

Bruno:

关于这个保持沉默。

James:

我同意这个说法。Node是一门新技术,所以目前,帮助会少一些。可是当Node越来越成熟的时候,这方面就不是问题了.

hefeimissyou
hefeimissyou
翻译于 2015/07/12 11:40
1

第三轮: 语法

第三轮比较了理解两种语言语法的难易程度。Craig判定这一轮Node获胜。

Bruno:

我非常不同意这个观点。PHP的语法中的确有一些怪象,其中的很多已经被修复了,在新的版本中,还有很多要被移除。另一方面,JS中也有“this”这个问题~ 

 关于bullet 3 (开发的时候,使用js你不需要在client端开发和Server端开发的时候做切换),我不同意这个观念。服务器环境和客户端的开发环境已经完全不通了,大脑中的切换还是需要的。总是有些新的语法你不能再浏览器中使用,反之亦然,所以这某种程度上也是语言的切换。

hefeimissyou
hefeimissyou
翻译于 2015/07/12 11:46
1

Bullet 4 (理解 JS 会让你更希望使用它)  这从某种程度上来说我是赞同的。 我在工作中使用 JS 和 PHP多年,使用 JS 的时间更久,但我对它却喜欢甚少——尽管那纯粹是个人倾向。

James:

我爱 JavaScript。我知道它有它的怪癖,并且我知道一些原因,ECMAScript 2015 将会修改掉一些,并给语言带来一部分令人激动的新特性。JavaScript 是强有力和灵活的,并能适应很多不同风格的编程。与 PHP 对照,我享受使用 JavaScript。Node(Node.js)就是其中之一。

溪边九节
溪边九节
翻译于 2015/07/13 19:43
2

第四轮:开发工具

Round 4:考虑这两种技术所使用的开发工具,Node 因为有开发工具 npm,所以略胜一筹。

Bruno:

虽然,开发者最初受到 npm 的鼓舞,但是现在有 leaps 和 bounds 比 npm 用着更舒服,而且如果你在电脑上安装了同一个库的两个版本的话,leaps 和 bounds 不会让你的系统崩溃。而且相对于 npm 而言,leaps 和 bounds 允许设计者使用递归思想,而递归思想是如此的重要,以至于当开发者准备着手建立一个包管理器时,首先考虑的就是这一点。

npm 还有一个致命的缺点,我把它称为“开发者协作友好”,npm 不能很好地做到这点,对于 npm 而言只有开发者本身能够理解自己写的东西。最后,npm 与 Vagrant 不能很好地兼容,这直接的妨碍了您开始自己工作,就更别说 npm 不关注用户们的需求了。npm 有一个 bug 已经存在了很多年,它导致该软件在 windows 上基本不能使用,这可不算是小问题了。当然 PHP 也有很多愚蠢的错误,但是这些错误并不会与你的系统之间发生问题。

明日天涯993
明日天涯993
翻译于 2015/07/22 20:06
1

的确,PHP并没有自带编译器,但我不认为它应该这样做。这样的便利不应该由一个包管理器或者说是一个独立的应用来完成。如果将来有一天,有人为 Node 开发了一个很好的包管理器,把它与现有的编译器替换将会极其困难。让它相对独立,人们可以便于切换。此外,安装它仅需要在终端上输入一行代码,或者下载一个安装程序。
书中提到的编译器影响很小的说法,是显而易见的错误。自从PHP开发完成后,编译器就影响了每一位新加入进来的 PHP 开发者,他们中的一些佼佼者不得不将它添加到现有的流程中。只基于编译器存在之前就有很多 PHP 用户的理由,并不能说明它的作用较小。事实上,自从有了它,它就产生了巨大的影响。一些人所说的“对社区造成的影响很少“的言论根本没有事实依据。
现在,我不能在大多数 PHP 开发者都希望安装 Node 这个问题上争论,这是真的事实。可悲的是,很多好的工具都首先基于 Node 下开发,但我仍然希望就像 Node-free 开发环境一样,也可用于开发BowerPHP

Iam魔方
Iam魔方
翻译于 2015/07/29 14:06
1

James:

我很高兴有人加入Node。

我喜欢 npm。它易于安装,易于使用,并有数以千计的包可用于几乎任何需要。我也喜欢这样的事实,npm 可以选择全球的和本地的程序包(相比之下,一些语言如Ruby,它的标准需要将你的程序包安装在你的 Ruby 版本的旁边)。它的工具也很棒。一些工具,例如 Bower 和 Grunt,在我工作流中都有一个固定的位置,它们成倍地提升了我的工作效率。
另外值得一提的是,npm 已经开发出了第3版的 β 版。它解决了 Bruno 提到很多问题,例如嵌套node_modules 方法错误等。

下文引用自entire smackdown:

    PHP开发人员可能希望(或需要)在某些场合安装Node.js。反过来不是真的。


Iam魔方
Iam魔方
翻译于 2015/07/29 14:48
1

第五轮: 环境

第5轮要说的是技术的可用性和部署情况,以及被哪些平台和生态系统支持。Craig 对于这一点也不十分明确,但是看起来似乎更偏向于 Node。

Bruno:

Craig 说他曾比较 PHP 和 Node 在 web 方面的优势(常见的 web 开发问题),然后说到处都用到了 JS。首先,我们来比较 Node.js,而不是 JS 本身,其次,我们比较了两种语言在什么环境下可以运行。猴子比鱼要厉害,因为鱼太蠢了不能爬树,但是猴子和鱼都会游泳。那么我们来比较它们做得怎么样吧。

在 web 开发环境中,PHP 获胜了。这里是一些基于 PHP 的桌面程序工具——是的,也许你不会使用它们,但你一定会用这些基于 PHP 的命令行程序

osc首席说得对但实现不了
osc首席说得对但实现不了
翻译于 2015/08/01 19:00
1

James:

我和 Craig 又一次达成一致。一些特性让 Node.js 变得如此流行(速度,可扩展性,与 JSON 密切相连,低资源占用)使它适合于许多其他类型的应用程序,例如强有力的物联网设备。我觉得,谁会不喜欢机器人呢

Node 使得项目获得了提升,诸如NW.js(一个基于 Chromium 和 Node.js 的应用),它允许你在 HTML 和 JavaScript 上编写本地 APP。这多令人兴奋!

溪边九节
溪边九节
翻译于 2015/07/15 19:41
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(105)

全体人员
全体人员

引用来自“Frank_mc”的评论

这个时候必须大喊一句
PHP是世界上最好的语言,没有之一

引用来自“wancheng”的评论

除了PHP,你还精通什么?

引用来自“lirongfei123”的评论

这里只是一句梗
二楼是新来的,体谅下。
k
kaven276
javascript/node 的简单性是他们成功的根源,没有多余的语法、数据结构、多余的形式上的东西,而基于事件、异步、闭包使得 node 对于一般程序员来说感觉怪怪无法接受,但是对于理解它的程序员来说,这个才是符合真实世界的最自然的编程方式。js/node如此简单的语言,却有着非常易用的模块系统,使得这个体系可以做出精彩创新的应用,里面集成大量第三方的成果。老子说,一生二、二生三、三生万物。js/node 的三就是 1、prototype 2、event/cabllback/async 3、closure. 有了模块和包系统后,三生万物。再次强调,简单统一才是强大的根源。
吃土的狒狒
吃土的狒狒
我就喜欢使用php,没办法
唐海

引用来自“jQer”的评论

Java 输是输在底层 IO 模型,除非你的 IO 模型在 Linux 是 epoll ,在 BSD 是 kqueue。然而这一切到了 Windows 貌似智能用 IO Completion Ports (那些扯淡 C# 异步的赶紧就闭了嘴了,你的操作系统非阻塞都是个问题)。多线程和多进程模型,都是找虐。

引用来自“唐海”的评论

你才是扯淡,C#异步可不一定要多线程,C#异步提供async await只是语法,语法后面你可以用多线程或者单线程实现异步。比如windows上照样有select可以使用。linux上照样可以用C#包装epoll

引用来自“jQer”的评论

先TM把非阻塞的概念搞清楚,windows 只是在模拟而已,不是真正的非阻塞,所以windows的并发比linux上要差很多,这也是为什么nginx在windows表现不行的原因。至于 epoll ,你连 epoll是什么都分布清楚,还包装 epoll

引用来自“maxiaoxia”的评论

这才是无厘头,windows怎么就模拟啦,那看来的,而且并发响应这事又从哪儿听来的,还不让别人讨论啦,多大的派头啊

引用来自“jQer”的评论

你告诉我Windows的IO模型是什么机制,包含什么样的系统调用?

引用来自“jyh149129”的评论

送你两字“傻x”,还“模拟”呢,看你举的例子…智商堪忧

引用来自“jQer”的评论

你是你妈的逼呀,你给你爹讲一下 Windows 的非阻塞 IO 是什么,系统调用 API 都有什么? 讲不出来就滚你妈逼。爹可以告诉你 Linux 是 epoll_wait epoll_ctl …… 分为水平触发、边缘触发,BSD是 kqeue,某些版本 Unix 仅支持低效 select

引用来自“唐海”的评论

我封装epoll的时候你还在玩泥巴,异步为什么一定要单线程非阻塞?多线程阻塞就不能异步了?你连什么是异步都没搞清楚。windows上select调用同linux select几乎一样就是单线程非阻塞api。你就知道个epoll难道select不算单线程非阻塞api? windows完成端口并发完全不逊于epoll

引用来自“jQer”的评论

"我封装epoll的时候你还在玩泥巴,异步为什么一定要单线程非阻塞?多线程阻塞就不能异步了" 你是个傻逼呀,还是装傻逼呀,还是真傻逼呀!!!??? 不带这么逗比的好么,都非阻塞了,还多线程,你脑子被你妈妈敲坏了吗。连非阻塞 IO 都不理解,也这么大胆子BIBI。 别再逗我了,好吗!孩子。这世界上只有傻逼才会说出“多线程非阻塞 IO”这种话!!!!!!!!!!!!!!

引用来自“唐海”的评论

看来是你眼睛瞎了, 多线程阻塞,你自己傻逼要加个非字上去还来喷我

引用来自“jQer”的评论

多线程阻塞还异步你妹呀!我聊个草!

引用来自“唐海”的评论

你水平也就是这个层次了,既然是阻塞API当然要用多线程才能异步了,比如A线程要读文件用阻塞接口,可以放到另外一个线程B去读,读完再回调到A线程,懂不?一句话就能看出你的水平了,不是声音喊得高水平就高的

引用来自“jQer”的评论

别逗我了,真的!线程间通信,用互斥量和条件信号发收信息就完成了,还异步,异步你妹呀!你呀连基本的线程池都没写过吧。

引用来自“唐海”的评论

http://www.cnblogs.com/egametang/archive/2012/04/23/2466728.html 跟你讨论简直降低我档次,这篇博客是我设计的线程池

引用来自“jQer”的评论

lock 在哪? 被你吃了,你的线程池领取线程不带锁的!?

引用来自“唐海”的评论

这是接口设计,实现可以翻翻我的github,https://github.com/egametang/Egametang/tree/5761e57b915fb7f4aa61dc4fd06ce6e9471743de/src/thread

引用来自“jQer”的评论

教教你怎么设计线程池 spawn: _lock() _signal() _something() _unlock() pool: for(;;) { _lock() _wait() _something() _unlock() _something() }

引用来自“唐海”的评论

你这是垃圾设计,C++中要是_something()抛出个异常,你这段代码就不会unlock,线程被永久锁死

引用来自“jQer”的评论

别这么逗比了,孩子,自己去把翻把翻随意几个提供线程池的语言的源代码,看看是不是这样的。还抛出个异常!第一:你的代码没有异常处理?第二:你的代码没有超时处理? 问的都这么逗比!健壮的程序甚至自带线程堆管理。

引用来自“唐海”的评论

这说明你线程池写的够烂,你的线程池是提供给别人用的,别人放进线程池的函数你怎么能保证他处理了异常。所以一般会用guard手法去保障异常安全,也就是用C++构造函数去lock,析构函数去unlock,懂不

引用来自“jQer”的评论

哎吆,还guard呢。我就问问,你的线程池不加锁,分发的线程数你怎么计算?假如你的池最大200个线程,你怎么能准确计算当前分发了多少个线程?同时分发两个线程,同时写线程计数器怎么办?同时来了300个请求,第201个到300个怎么办?扔掉?你都没有排队?
你哪只眼睛看到我线程池不加锁了呢? https://github.com/egametang/Egametang/blob/5761e57b915fb7f4aa61dc4fd06ce6e9471743de/src/thread/thread_pool.cc 里面不是写了mutex::scoped_lock lock(mtx); 这不是加锁? 刚刚看了下我github线程池代码,居然是我5年前写的。那时我大学毕业不到2年,估计你的水平是我大学刚毕业的水平。
jQer
jQer
如果排队,没有领取锁,你怎么排队?????????? 然后线程空闲出来,你又怎么从排队中准确的把一个等待的任务分发给新的空闲线程?我给你的代码是标准化规范线程池,到了你这里还出来异常了。
jQer
jQer

引用来自“jQer”的评论

Java 输是输在底层 IO 模型,除非你的 IO 模型在 Linux 是 epoll ,在 BSD 是 kqueue。然而这一切到了 Windows 貌似智能用 IO Completion Ports (那些扯淡 C# 异步的赶紧就闭了嘴了,你的操作系统非阻塞都是个问题)。多线程和多进程模型,都是找虐。

引用来自“唐海”的评论

你才是扯淡,C#异步可不一定要多线程,C#异步提供async await只是语法,语法后面你可以用多线程或者单线程实现异步。比如windows上照样有select可以使用。linux上照样可以用C#包装epoll

引用来自“jQer”的评论

先TM把非阻塞的概念搞清楚,windows 只是在模拟而已,不是真正的非阻塞,所以windows的并发比linux上要差很多,这也是为什么nginx在windows表现不行的原因。至于 epoll ,你连 epoll是什么都分布清楚,还包装 epoll

引用来自“maxiaoxia”的评论

这才是无厘头,windows怎么就模拟啦,那看来的,而且并发响应这事又从哪儿听来的,还不让别人讨论啦,多大的派头啊

引用来自“jQer”的评论

你告诉我Windows的IO模型是什么机制,包含什么样的系统调用?

引用来自“jyh149129”的评论

送你两字“傻x”,还“模拟”呢,看你举的例子…智商堪忧

引用来自“jQer”的评论

你是你妈的逼呀,你给你爹讲一下 Windows 的非阻塞 IO 是什么,系统调用 API 都有什么? 讲不出来就滚你妈逼。爹可以告诉你 Linux 是 epoll_wait epoll_ctl …… 分为水平触发、边缘触发,BSD是 kqeue,某些版本 Unix 仅支持低效 select

引用来自“唐海”的评论

我封装epoll的时候你还在玩泥巴,异步为什么一定要单线程非阻塞?多线程阻塞就不能异步了?你连什么是异步都没搞清楚。windows上select调用同linux select几乎一样就是单线程非阻塞api。你就知道个epoll难道select不算单线程非阻塞api? windows完成端口并发完全不逊于epoll

引用来自“jQer”的评论

"我封装epoll的时候你还在玩泥巴,异步为什么一定要单线程非阻塞?多线程阻塞就不能异步了" 你是个傻逼呀,还是装傻逼呀,还是真傻逼呀!!!??? 不带这么逗比的好么,都非阻塞了,还多线程,你脑子被你妈妈敲坏了吗。连非阻塞 IO 都不理解,也这么大胆子BIBI。 别再逗我了,好吗!孩子。这世界上只有傻逼才会说出“多线程非阻塞 IO”这种话!!!!!!!!!!!!!!

引用来自“唐海”的评论

看来是你眼睛瞎了, 多线程阻塞,你自己傻逼要加个非字上去还来喷我

引用来自“jQer”的评论

多线程阻塞还异步你妹呀!我聊个草!

引用来自“唐海”的评论

你水平也就是这个层次了,既然是阻塞API当然要用多线程才能异步了,比如A线程要读文件用阻塞接口,可以放到另外一个线程B去读,读完再回调到A线程,懂不?一句话就能看出你的水平了,不是声音喊得高水平就高的

引用来自“jQer”的评论

别逗我了,真的!线程间通信,用互斥量和条件信号发收信息就完成了,还异步,异步你妹呀!你呀连基本的线程池都没写过吧。

引用来自“唐海”的评论

http://www.cnblogs.com/egametang/archive/2012/04/23/2466728.html 跟你讨论简直降低我档次,这篇博客是我设计的线程池

引用来自“jQer”的评论

lock 在哪? 被你吃了,你的线程池领取线程不带锁的!?

引用来自“唐海”的评论

这是接口设计,实现可以翻翻我的github,https://github.com/egametang/Egametang/tree/5761e57b915fb7f4aa61dc4fd06ce6e9471743de/src/thread

引用来自“jQer”的评论

教教你怎么设计线程池 spawn: _lock() _signal() _something() _unlock() pool: for(;;) { _lock() _wait() _something() _unlock() _something() }

引用来自“唐海”的评论

你这是垃圾设计,C++中要是_something()抛出个异常,你这段代码就不会unlock,线程被永久锁死

引用来自“jQer”的评论

别这么逗比了,孩子,自己去把翻把翻随意几个提供线程池的语言的源代码,看看是不是这样的。还抛出个异常!第一:你的代码没有异常处理?第二:你的代码没有超时处理? 问的都这么逗比!健壮的程序甚至自带线程堆管理。

引用来自“唐海”的评论

这说明你线程池写的够烂,你的线程池是提供给别人用的,别人放进线程池的函数你怎么能保证他处理了异常。所以一般会用guard手法去保障异常安全,也就是用C++构造函数去lock,析构函数去unlock,懂不
哎吆,还guard呢。我就问问,你的线程池不加锁,分发的线程数你怎么计算?假如你的池最大200个线程,你怎么能准确计算当前分发了多少个线程?同时分发两个线程,同时写线程计数器怎么办?同时来了300个请求,第201个到300个怎么办?扔掉?你都没有排队?
唐海

引用来自“jQer”的评论

Java 输是输在底层 IO 模型,除非你的 IO 模型在 Linux 是 epoll ,在 BSD 是 kqueue。然而这一切到了 Windows 貌似智能用 IO Completion Ports (那些扯淡 C# 异步的赶紧就闭了嘴了,你的操作系统非阻塞都是个问题)。多线程和多进程模型,都是找虐。

引用来自“唐海”的评论

你才是扯淡,C#异步可不一定要多线程,C#异步提供async await只是语法,语法后面你可以用多线程或者单线程实现异步。比如windows上照样有select可以使用。linux上照样可以用C#包装epoll

引用来自“jQer”的评论

先TM把非阻塞的概念搞清楚,windows 只是在模拟而已,不是真正的非阻塞,所以windows的并发比linux上要差很多,这也是为什么nginx在windows表现不行的原因。至于 epoll ,你连 epoll是什么都分布清楚,还包装 epoll

引用来自“maxiaoxia”的评论

这才是无厘头,windows怎么就模拟啦,那看来的,而且并发响应这事又从哪儿听来的,还不让别人讨论啦,多大的派头啊

引用来自“jQer”的评论

你告诉我Windows的IO模型是什么机制,包含什么样的系统调用?

引用来自“jyh149129”的评论

送你两字“傻x”,还“模拟”呢,看你举的例子…智商堪忧

引用来自“jQer”的评论

你是你妈的逼呀,你给你爹讲一下 Windows 的非阻塞 IO 是什么,系统调用 API 都有什么? 讲不出来就滚你妈逼。爹可以告诉你 Linux 是 epoll_wait epoll_ctl …… 分为水平触发、边缘触发,BSD是 kqeue,某些版本 Unix 仅支持低效 select

引用来自“唐海”的评论

我封装epoll的时候你还在玩泥巴,异步为什么一定要单线程非阻塞?多线程阻塞就不能异步了?你连什么是异步都没搞清楚。windows上select调用同linux select几乎一样就是单线程非阻塞api。你就知道个epoll难道select不算单线程非阻塞api? windows完成端口并发完全不逊于epoll

引用来自“jQer”的评论

"我封装epoll的时候你还在玩泥巴,异步为什么一定要单线程非阻塞?多线程阻塞就不能异步了" 你是个傻逼呀,还是装傻逼呀,还是真傻逼呀!!!??? 不带这么逗比的好么,都非阻塞了,还多线程,你脑子被你妈妈敲坏了吗。连非阻塞 IO 都不理解,也这么大胆子BIBI。 别再逗我了,好吗!孩子。这世界上只有傻逼才会说出“多线程非阻塞 IO”这种话!!!!!!!!!!!!!!

引用来自“唐海”的评论

看来是你眼睛瞎了, 多线程阻塞,你自己傻逼要加个非字上去还来喷我

引用来自“jQer”的评论

多线程阻塞还异步你妹呀!我聊个草!

引用来自“唐海”的评论

你水平也就是这个层次了,既然是阻塞API当然要用多线程才能异步了,比如A线程要读文件用阻塞接口,可以放到另外一个线程B去读,读完再回调到A线程,懂不?一句话就能看出你的水平了,不是声音喊得高水平就高的

引用来自“jQer”的评论

别逗我了,真的!线程间通信,用互斥量和条件信号发收信息就完成了,还异步,异步你妹呀!你呀连基本的线程池都没写过吧。

引用来自“唐海”的评论

http://www.cnblogs.com/egametang/archive/2012/04/23/2466728.html 跟你讨论简直降低我档次,这篇博客是我设计的线程池

引用来自“jQer”的评论

lock 在哪? 被你吃了,你的线程池领取线程不带锁的!?

引用来自“唐海”的评论

这是接口设计,实现可以翻翻我的github,https://github.com/egametang/Egametang/tree/5761e57b915fb7f4aa61dc4fd06ce6e9471743de/src/thread

引用来自“jQer”的评论

教教你怎么设计线程池 spawn: _lock() _signal() _something() _unlock() pool: for(;;) { _lock() _wait() _something() _unlock() _something() }

引用来自“唐海”的评论

你这是垃圾设计,C++中要是_something()抛出个异常,你这段代码就不会unlock,线程被永久锁死

引用来自“jQer”的评论

别这么逗比了,孩子,自己去把翻把翻随意几个提供线程池的语言的源代码,看看是不是这样的。还抛出个异常!第一:你的代码没有异常处理?第二:你的代码没有超时处理? 问的都这么逗比!健壮的程序甚至自带线程堆管理。
这说明你线程池写的够烂,你的线程池是提供给别人用的,别人放进线程池的函数你怎么能保证他处理了异常。所以一般会用guard手法去保障异常安全,也就是用C++构造函数去lock,析构函数去unlock,懂不
唐海
这说明你线程池写的够烂,你的线程池是提供给别人用的,别人放进线程池的函数你怎么能保证他处理了异常。所以一般会用guard手法去保障异常安全,也就是用C++构造函数去lock,析构函数去unlock,懂不
jQer
jQer

引用来自“jQer”的评论

Java 输是输在底层 IO 模型,除非你的 IO 模型在 Linux 是 epoll ,在 BSD 是 kqueue。然而这一切到了 Windows 貌似智能用 IO Completion Ports (那些扯淡 C# 异步的赶紧就闭了嘴了,你的操作系统非阻塞都是个问题)。多线程和多进程模型,都是找虐。

引用来自“唐海”的评论

你才是扯淡,C#异步可不一定要多线程,C#异步提供async await只是语法,语法后面你可以用多线程或者单线程实现异步。比如windows上照样有select可以使用。linux上照样可以用C#包装epoll

引用来自“jQer”的评论

先TM把非阻塞的概念搞清楚,windows 只是在模拟而已,不是真正的非阻塞,所以windows的并发比linux上要差很多,这也是为什么nginx在windows表现不行的原因。至于 epoll ,你连 epoll是什么都分布清楚,还包装 epoll

引用来自“maxiaoxia”的评论

这才是无厘头,windows怎么就模拟啦,那看来的,而且并发响应这事又从哪儿听来的,还不让别人讨论啦,多大的派头啊

引用来自“jQer”的评论

你告诉我Windows的IO模型是什么机制,包含什么样的系统调用?

引用来自“jyh149129”的评论

送你两字“傻x”,还“模拟”呢,看你举的例子…智商堪忧

引用来自“jQer”的评论

你是你妈的逼呀,你给你爹讲一下 Windows 的非阻塞 IO 是什么,系统调用 API 都有什么? 讲不出来就滚你妈逼。爹可以告诉你 Linux 是 epoll_wait epoll_ctl …… 分为水平触发、边缘触发,BSD是 kqeue,某些版本 Unix 仅支持低效 select

引用来自“唐海”的评论

我封装epoll的时候你还在玩泥巴,异步为什么一定要单线程非阻塞?多线程阻塞就不能异步了?你连什么是异步都没搞清楚。windows上select调用同linux select几乎一样就是单线程非阻塞api。你就知道个epoll难道select不算单线程非阻塞api? windows完成端口并发完全不逊于epoll

引用来自“jQer”的评论

"我封装epoll的时候你还在玩泥巴,异步为什么一定要单线程非阻塞?多线程阻塞就不能异步了" 你是个傻逼呀,还是装傻逼呀,还是真傻逼呀!!!??? 不带这么逗比的好么,都非阻塞了,还多线程,你脑子被你妈妈敲坏了吗。连非阻塞 IO 都不理解,也这么大胆子BIBI。 别再逗我了,好吗!孩子。这世界上只有傻逼才会说出“多线程非阻塞 IO”这种话!!!!!!!!!!!!!!

引用来自“唐海”的评论

看来是你眼睛瞎了, 多线程阻塞,你自己傻逼要加个非字上去还来喷我

引用来自“jQer”的评论

多线程阻塞还异步你妹呀!我聊个草!

引用来自“唐海”的评论

你水平也就是这个层次了,既然是阻塞API当然要用多线程才能异步了,比如A线程要读文件用阻塞接口,可以放到另外一个线程B去读,读完再回调到A线程,懂不?一句话就能看出你的水平了,不是声音喊得高水平就高的

引用来自“jQer”的评论

别逗我了,真的!线程间通信,用互斥量和条件信号发收信息就完成了,还异步,异步你妹呀!你呀连基本的线程池都没写过吧。

引用来自“唐海”的评论

http://www.cnblogs.com/egametang/archive/2012/04/23/2466728.html 跟你讨论简直降低我档次,这篇博客是我设计的线程池

引用来自“jQer”的评论

lock 在哪? 被你吃了,你的线程池领取线程不带锁的!?

引用来自“唐海”的评论

这是接口设计,实现可以翻翻我的github,https://github.com/egametang/Egametang/tree/5761e57b915fb7f4aa61dc4fd06ce6e9471743de/src/thread

引用来自“jQer”的评论

教教你怎么设计线程池 spawn: _lock() _signal() _something() _unlock() pool: for(;;) { _lock() _wait() _something() _unlock() _something() }

引用来自“唐海”的评论

你这是垃圾设计,C++中要是_something()抛出个异常,你这段代码就不会unlock,线程被永久锁死
别这么逗比了,孩子,自己去把翻把翻随意几个提供线程池的语言的源代码,看看是不是这样的。还抛出个异常!第一:你的代码没有异常处理?第二:你的代码没有超时处理? 问的都这么逗比!健壮的程序甚至自带线程堆管理。
唐海

引用来自“jQer”的评论

Java 输是输在底层 IO 模型,除非你的 IO 模型在 Linux 是 epoll ,在 BSD 是 kqueue。然而这一切到了 Windows 貌似智能用 IO Completion Ports (那些扯淡 C# 异步的赶紧就闭了嘴了,你的操作系统非阻塞都是个问题)。多线程和多进程模型,都是找虐。

引用来自“唐海”的评论

你才是扯淡,C#异步可不一定要多线程,C#异步提供async await只是语法,语法后面你可以用多线程或者单线程实现异步。比如windows上照样有select可以使用。linux上照样可以用C#包装epoll

引用来自“jQer”的评论

先TM把非阻塞的概念搞清楚,windows 只是在模拟而已,不是真正的非阻塞,所以windows的并发比linux上要差很多,这也是为什么nginx在windows表现不行的原因。至于 epoll ,你连 epoll是什么都分布清楚,还包装 epoll

引用来自“maxiaoxia”的评论

这才是无厘头,windows怎么就模拟啦,那看来的,而且并发响应这事又从哪儿听来的,还不让别人讨论啦,多大的派头啊

引用来自“jQer”的评论

你告诉我Windows的IO模型是什么机制,包含什么样的系统调用?

引用来自“jyh149129”的评论

送你两字“傻x”,还“模拟”呢,看你举的例子…智商堪忧

引用来自“jQer”的评论

你是你妈的逼呀,你给你爹讲一下 Windows 的非阻塞 IO 是什么,系统调用 API 都有什么? 讲不出来就滚你妈逼。爹可以告诉你 Linux 是 epoll_wait epoll_ctl …… 分为水平触发、边缘触发,BSD是 kqeue,某些版本 Unix 仅支持低效 select

引用来自“唐海”的评论

我封装epoll的时候你还在玩泥巴,异步为什么一定要单线程非阻塞?多线程阻塞就不能异步了?你连什么是异步都没搞清楚。windows上select调用同linux select几乎一样就是单线程非阻塞api。你就知道个epoll难道select不算单线程非阻塞api? windows完成端口并发完全不逊于epoll

引用来自“jQer”的评论

"我封装epoll的时候你还在玩泥巴,异步为什么一定要单线程非阻塞?多线程阻塞就不能异步了" 你是个傻逼呀,还是装傻逼呀,还是真傻逼呀!!!??? 不带这么逗比的好么,都非阻塞了,还多线程,你脑子被你妈妈敲坏了吗。连非阻塞 IO 都不理解,也这么大胆子BIBI。 别再逗我了,好吗!孩子。这世界上只有傻逼才会说出“多线程非阻塞 IO”这种话!!!!!!!!!!!!!!

引用来自“唐海”的评论

看来是你眼睛瞎了, 多线程阻塞,你自己傻逼要加个非字上去还来喷我

引用来自“jQer”的评论

多线程阻塞还异步你妹呀!我聊个草!

引用来自“唐海”的评论

你水平也就是这个层次了,既然是阻塞API当然要用多线程才能异步了,比如A线程要读文件用阻塞接口,可以放到另外一个线程B去读,读完再回调到A线程,懂不?一句话就能看出你的水平了,不是声音喊得高水平就高的

引用来自“jQer”的评论

别逗我了,真的!线程间通信,用互斥量和条件信号发收信息就完成了,还异步,异步你妹呀!你呀连基本的线程池都没写过吧。

引用来自“唐海”的评论

http://www.cnblogs.com/egametang/archive/2012/04/23/2466728.html 跟你讨论简直降低我档次,这篇博客是我设计的线程池

引用来自“jQer”的评论

lock 在哪? 被你吃了,你的线程池领取线程不带锁的!?

引用来自“唐海”的评论

这是接口设计,实现可以翻翻我的github,https://github.com/egametang/Egametang/tree/5761e57b915fb7f4aa61dc4fd06ce6e9471743de/src/thread

引用来自“jQer”的评论

教教你怎么设计线程池 spawn: _lock() _signal() _something() _unlock() pool: for(;;) { _lock() _wait() _something() _unlock() _something() }
你这是垃圾设计,C++中要是_something()抛出个异常,你这段代码就不会unlock,线程被永久锁死
返回顶部
顶部