从 0 开始学游戏开发
蔡能
原网易游戏引擎架构师,资深游戏底层技术专家
37243 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
从 0 开始学游戏开发
15
15
1.0x
00:00/00:00
登录|注册

第24讲 | 不可忽视的多线程及并发问题

更换Python语言的实现版本
利用多进程解决问题
增加了线程间数据通信和同步的困难
每个进程有自己的独立的GIL锁
使用多进程而不是多线程
使用Python的多线程效果不好时,创建独立的进程来实现并行化
使用多进程
GIL的存在禁止多线程的并行执行
C-Python的线程是操作系统的原生线程
线程中的内存和资源是共享的
单个进程的切片
真正的并发状态,在物理状态下的并发运行
出现在多个物理CPU情况下
CPU将运行的线程分成若干个CPU时间片来运行
出现在单个CPU情况下
Python以多进程方式进行操作时,处理进程崩溃或报错的方法
解决方案
网络的并发
线程
并行
并发
multiprocess
解决方案
GIL(Global Interpreter Lock,全局解释锁)
多线程
并行
并发
小问题
Python的GIL锁问题
概念介绍
如何尽可能利用多线程和并发的优势?
为什么Python用多个CPU的时候会出现问题?
多线程和并发究竟有什么区别和联系?
总结
如何尽可能多地利用多线程和并发的优势?

该思维导图由 AI 生成,仅供参考

既然我们说到了服务器端的开发,我们就不得不提起多线程和并发的问题,因为如果没有多线程和并发,是不可能做网络服务器端的,除非你的项目是 base 在 Nginx 或者 Apache 之上的。

多线程和并发究竟有什么区别和联系?

提到并发,不得不提到并行,所以我就讲这三个概念:并发、并行,以及多线程。作为初学者,你或许不太明白,多线程和并发究竟有什么区别和联系?下面我们就分别来看看。
并发出现在电脑只有一个 CPU 的情况下,那如果有多个线程需要操作,该怎么办呢?CPU 不可能一次只运行一个程序,运行完一个再运行第二个,这个效率任谁都忍受不了啊!所以,就想了个办法。
CPU 将运行的线程分成若干个 CPU 时间片来运行。不运行的那个线程就挂起,运行的时候,那个线程就活过来,切换地特别快,就好像是在同时运行一样。
你可以想象这个场景,有一个象棋大师,一个人对十个对手下棋,那十个人轮流和他下。大师从 1 号棋手这里开始下,下完 1 号走到 2 号的棋手面前,下 2 号棋手的棋,一直轮流走下去,直到再走回 1 号棋手这里再下一步。只要象棋大师下象棋下得足够快,然后他移动到下一位棋手这里又移动得足够快,大家都会觉得好像有十位象棋大师在和十个对手下棋。事实上只有一位象棋大师在下棋,只是他移动得很快而已。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了多线程和并发在服务器端开发中的重要性,以及Python在利用多线程时可能遇到的问题和解决方法。文章首先介绍了并发、并行和多线程的区别,强调了多线程在单个CPU情况下的作用,以及多线程在单个进程内共享资源的特点。然后,文章指出了Python在利用多个CPU时可能出现的问题,即全局解释锁(GIL)的存在导致多线程无法并行执行。为了解决这一问题,文章提出了使用多进程包或将关键部分用C/C++写成Python扩展的方法。此外,文章还通过代码比较展示了单线程和多线程在计算密集型任务中的差异。最后,文章指出了Python的GIL问题是由实现语言的差异造成的,并且提到了使用Java写成的Python和.NET下的Python并不存在这一问题。总的来说,本文内容深入浅出,为读者解释了多线程和并发的概念,以及Python在多线程利用上的问题和解决方法。文章内容涵盖了技术概念的解释和解决方案的提出,对于需要了解多线程和并发在服务器端开发中的读者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《从 0 开始学游戏开发》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • 放羊大王
    监听信号量,重新 fork 。加锁什么是最烦的,go的sync包,现在都还没搞懂。能讲讲 ipc 通信方式与具体最小实现,伪代码也行, 以及 actor 和 csp 。我看 elixir 也不错,就是用的人少。 哎!感觉多线程其实就是运行同一份代码,通过if判断运行逻辑于是就有了master worker。
    2018-08-08
    4
  • Stone
    请问为什么在多核CPU上做不到数百次间隔检查才会导致一次线程切换? 引用: “在单核的 CPU 上,数百次间隔检查才会导致一次线程切换。在多核 CPU 上,就做不到这些了。”
    2022-05-20
    1
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部