多线程有什么用?

转载 2018年04月15日 15:11:32

这么解释问题吧:

1。单进程单线程:一个人在一个桌子上吃菜。
2。单进程多线程:多个人在同一个桌子上一起吃菜。
3。多进程单线程:多个人每个人在自己的桌子上吃菜。

多线程的问题是多个人同时吃一道菜的时候容易发生争抢,例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候已经被夹走菜了。。。此时就必须等一个人夹一口之后,在还给另外一个人夹菜,也就是说资源共享就会发生冲突争抢。


1。对于 Windows 系统来说,【开桌子】的开销很大,因此 Windows 鼓励大家在一个桌子上吃菜。因此 Windows 多线程学习重点是要大量面对资源争抢与同步方面的问题。


2。对于 Linux 系统来说,【开桌子】的开销很小,因此 Linux 鼓励大家尽量每个人都开自己的桌子吃菜。这带来新的问题是:坐在两张不同的桌子上,说话不方便。因此,Linux 下的学习重点大家要学习进程间通讯的方法。

--
补充:有人对这个开桌子的开销很有兴趣。我把这个问题推广说开一下。

开桌子的意思是指创建进程。开销这里主要指的是时间开销。
可以做个实验:创建一个进程,在进程中往内存写若干数据,然后读出该数据,然后退出。此过程重复 1000 次,相当于创建/销毁进程 1000 次。在我机器上的测试结果是:
UbuntuLinux:耗时 0.8 秒
Windows7:耗时 79.8 秒
两者开销大约相差一百倍。

这意味着,在 Windows 中,进程创建的开销不容忽视。换句话说就是,Windows 编程中不建议你创建进程,如果你的程序架构需要大量创建进程,那么最好是切换到 Linux 系统。

大量创建进程的典型例子有两个,一个是 gnu autotools 工具链,用于编译很多开源代码的,他们在 Windows 下编译速度会很慢,因此软件开发人员最好是避免使用 Windows。另一个是服务器,某些服务器框架依靠大量创建进程来干活,甚至是对每个用户请求就创建一个进程,这些服务器在 Windows 下运行的效率就会很差。这"可能"也是放眼全世界范围,Linux 服务器远远多于 Windows 服务器的原因。

--
再次补充:如果你是写服务器端应用的,其实在现在的网络服务模型下,开桌子的开销是可以忽略不计的,因为现在一般流行的是按照 CPU 核心数量开进程或者线程,开完之后在数量上一直保持,进程与线程内部使用协程或者异步通信来处理多个并发连接,因而开进程与开线程的开销可以忽略了。

另外一种新的开销被提上日程:核心切换开销。

现代的体系,一般 CPU 会有多个核心,而多个核心可以同时运行多个不同的线程或者进程。

当每个 CPU 核心运行一个进程的时候,由于每个进程的资源都独立,所以 CPU 核心之间切换的时候无需考虑上下文。

当每个 CPU 核心运行一个线程的时候,由于每个线程需要共享资源,所以这些资源必须从 CPU 的一个核心被复制到另外一个核心,才能继续运算,这占用了额外的开销。换句话说,在 CPU 为多核的情况下,多线程在性能上不如多进程。

因而,当前面向多核的服务器端编程中,需要习惯多进程而非多线程。

另外:用C、C++或Java来改写相同的死循环,直接可以把全部核心跑满,4核就跑到400%,8核就跑到800%,为什么Python不行呢?

答:因为Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。

GIL是Python解释器设计的历史遗留问题,通常我们用的解释器是官方实现的CPython,要真正利用多核,除非重写一个不带GIL的解释器。

所以,在Python中,可以使用多线程,但不要指望能有效利用多核。如果一定要通过多线程利用多核,那只能通过C扩展来实现,不过这样就失去了Python简单易用的特点。

不过,也不用过于担心,Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。


参考作者:pansz、廖雪峰

链接:

https://www.zhihu.com/question/19901763/answer/13299543

https://www.liaoxuefeng.com

来源:知乎、廖雪峰的官方网站

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2003年中国CRM技术与产品发展趋势

2003年中国CRM技术与产品发展趋势 http://www.topoint.com.cn 2003-2-25    王广宇 高级顾问 江鹏程 蓝一  2003年中国市场上的CRM产品,将会体现决策支...
  • Drate
  • Drate
  • 2003-03-04 09:25:00
  • 1849

【Java】知乎:学习 JAVA,有什么书籍推荐?学习的方法和过程是怎样的?

①有一点C语言基础(初级的知道指针、数组链表、局部变量、全局变量、动态内存分配,堆栈) ②知道C++主要是面向对象,类,封装,继承,多态什么的,但很初级的了解 ③现在想好好学JAVA,从什么书看起...
  • u013016525
  • u013016525
  • 2017-03-09 12:51:01
  • 4702

Java 多线程(1) 多线程有什么用?

搜索关于线程相关知识的时候,在知乎上看到的这个答案还是很形象的。 问题:多线程有什么用? 回答一 这么解释问题吧: 1。单进程单线程:一个人在一个桌子上吃菜。 2。单进程多线程:...
  • huangzhen0914
  • huangzhen0914
  • 2015-04-22 14:45:11
  • 369

多线程有什么用:妙趣横生的比喻

作者:pansz 链接:https://www.zhihu.com/question/19901763/answer/13299543 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,...
  • danny__Hello
  • danny__Hello
  • 2017-02-12 23:48:56
  • 246

多线程的使用:优缺点

最近手上拿到一个程序,其中是
  • u014305097
  • u014305097
  • 2014-06-25 14:16:07
  • 7210

es6 Generator函数的含义

Generator函数的含义 Generator 与状态机 Generator 是实现状态机的最佳结构。比如,下面的clock函数就是一个状态机。 var ticking = true;...
  • ixygj197875
  • ixygj197875
  • 2018-01-30 22:29:55
  • 40

为什么cpu要一心二用:浅谈多线程编程的一个具体例子

什么是多线程,多线程就是多个执行序列。就是让cpu执行下这个序列,又执行下那个序列,不停地切换, 正所谓一心二用。        考虑一个实际场景: 客户端要向服务端发送文件,服务端会对发送文件进行检...
  • stpeace
  • stpeace
  • 2014-03-25 23:15:08
  • 5062

多线程是否真的有必要?

相比大家在投简历、面试等等过程中,或多或少会遇到这么一个问题:熟悉掌握多线程开发;谈谈你对多线程的认识。        其实,我有这么一个疑问,那就是多线程真的有必要么?根据我这两年来的项目经验,也...
  • winking324
  • winking324
  • 2014-06-14 00:09:39
  • 1527

多线程的运用和好处

转自 http://blog.163.com/sunflower123_happy/blog/static/173274421201122691321401/ CPU是以时间片的方式为进程分配C...
  • rghanbing4
  • rghanbing4
  • 2017-06-08 09:46:57
  • 1009

实战体会Java多线程编程的精要

在 Java 程序中使用多线程要比在 C 或 C++ 中容易得多,这是因为 Java 编程语言提供了语言级的支持。本文通过简单的编程示例来说明 Java 程序中的多线程是多么直观。读完本文以后,用户应...
  • jenshy
  • jenshy
  • 2006-04-27 08:45:00
  • 2877
收藏助手
不良信息举报
您举报文章:多线程有什么用?
举报原因:
原因补充:

(最多只允许输入30个字)