java 与 python 的并发争论

有一天,java遇到了python兄弟,调侃道:“我听一位刚学python的老伙计道,你这并发包很不好用呀。”

“怎么不好用了,我有Threading模块,只要创建一个Thread实例,调用start()就可以了,而且我的线程是真正的Posix Thread,这可是操作系统级的呀。”python道。

java道:“这年头,许多语言用的都是内核线程,谁还用模拟线程,用户线程呀,你这个特性也没什么起眼的,你多线程最致命的一点就是没法使用多核优势,在四核,八核的的cpu下多线程跑,依然只用了一核,白白浪费了人家的高性能呀。”

python脸红红地,争辩道:“这又不是独独我一门语言的过失,底层平台也有关系,我用的cpython解释器执行代码时,有一个GIL(Global Interpreter Lock)锁,Python线程执行前,必须先获得GIL锁,然后,每执行一段字节码,解释器就自动释放GIL锁,别的线程才有机会执行。这个GIL全局锁把所有线程的执行段都给上了锁,所以,多线程在Python中只能交替执行。这是CPython解释器的问题”

“那就赶快转移到我们JVM平台吧,你的兄弟Jython就很识相,他用的就是我们jvm的线程机制,没有那个问题!”

“你们平台也不是没任何问题,用了jython,是否就意味着失去了利用我们社区众多C模块库的机会,这对程序员哥哥而言可是大大的不友好啊。要想发挥多核优势,我也不是不可以,你要知道,除了多线程,还有多进程,我们的多进程编程也是十分方便的,multiprocessing提供了跨平台的多进程支持,还可以通过Pool批量创建进程,利用Queue,Pipes进行进程间通信。”

“多进程早就有了,但为什么后来还要引入多线程呢,还不是因为多进程有诸多缺陷。多进程产生更多的系统开销,当进行上下文切换的时候,进程记忆的所有内存地址都会失效,而线程切换的时候,用的是同一份虚拟内存空间。进程间通信也更为繁杂,需要用Queue put和get操作,如果是多线程,则共享所在进程的各种资源,只要声明一个全局变量,并通过加锁等方式保证线程安全就可以。”

“呵呵,轻描淡写,在并发环境下的编程就没有容易的。cpython未来将会有计划地移除CGL的,我们的生态前景还是十分光明的,最重要的是,我们应用范围比你要广,可以说是全能的运动员,在数据处理,网络爬虫,DevOps领域,却少见你们的身影。”

“咱现在比的是并发领域的处理方式。别跑题了,兄弟!” java道。

开发过程中一个异常问题探讨:

前端服务器利用nginx进行反向代理,后台配的是两个jetty服务,jetty里的webapp用的是spring boot,模版引擎用的是velocity,controller层有一些方法,在跳转之前设置了参数,如:

redirectAttributes.addFlashAttribute("isSuccess",true);

redirectAttributes.addFlashAttribute("msg",message);

return "redirect:/list";

当nginx location配置如下时:

location /myapp{

proxy_pass http://servicename/myapp/;

break;

access_log logs/$host.log_servicename main; }

返回的列表页面在客户端没有isSuccess,msg两个参数信息展示,但如果新加一个location配置,就有了,只是加了个斜杠:

location /myapp{

proxy_pass http://servicename/myapp/;

break;

access_log logs/$host.log_servicename main; }

location /myapp/{

proxy_pass http://servicename/myapp/;

break;

access_log logs/$host.log_servicename main; }

为什么会这样,有什么想法请留言?

原文发布于微信公众号 - java达人(drjava)

原文发表时间:2018-01-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏VMCloud

【解析向】腾讯云的Windows Server日志配置收集工具是个什么鬼?(3)

回顾上篇,解释了场景“2”中的四个标签,也介绍了对应着Windows Server中的四个功能在日常运维中究竟起到什么作用以及如何去驾驭他们。

48313
来自专栏happyJared

用Python统计你的简书数据

  说来也巧,之前有一次无意间留意到简书好像没有做文章总阅读量的统计(准确的说法应该叫展示),刚好最近有时间,趁这个机会就用Python写了这么个功能,既是学习...

1661
来自专栏微服务生态

Akka简单的性能测试

这种方案是采用MQ作为中间的媒介,在服务端采用线程池异步处理任务,处理完成之后将结果发送到MQ中,客户端采用侦听的方式得到结果继续进行处理。

1641
来自专栏FreeBuf

一种几乎无法被检测到的Punycode钓鱼攻击,Chrome、Firefox和Opera等浏览器都中招

国内的安全专家最近发现一种新的钓鱼攻击,“几乎无法检测”,即便平时十分谨慎的用户也可能无法逃过欺骗。黑客可利用Chrome、Firefox和Opera浏览器中的...

2339
来自专栏猛牛哥的博客

破解棋牌多开时遇到的一个问题:调试时大厅进程总是退出

2335
来自专栏张泽旭的专栏

信息管理系统(java)

该项目开发的软件为网络QQ账户信息管理系统软件,是鉴于目前人们QQ的使用领域的增加,QQ信息呈爆炸性增长的前提下人们对自己的QQ信息管理的自动化与准确化的要求日...

3532
来自专栏精讲JAVA

怎样编写高质量的Java代码

代码质量概述 怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行一些粗略的介绍...

44310
来自专栏张善友的专栏

事件流处理框架NEsper for .NET

复合事件处理(Complex Event Processing)介绍提到了开源的Esper,NEsper 是一个事件流处理(Event Stream Proce...

2426
来自专栏平凡文摘

怎样编写高质量的Java代码

1593
来自专栏机器学习算法与Python学习

干货 | Python 爬虫的工具列表大全

源 | 伯乐头条 | 小象 这个列表包含与网页抓取和数据处理的Python库。 网络 通用 urllib -网络库(stdlib)。 requests -网络...

3369

扫码关注云+社区

领取腾讯云代金券