Python 进程,线程,协程,锁机制,你知多少

2 02 3 年,朋友问我什么是线程和进程,我给他解释了半天。
线程是进程的子集,就像车间的工人在车间(进程)中工作一样。
每个人共享工作室资源,但每个人都有自己的工作站(资源)。
进程就像一个公司,拥有自己的资源,而线程就像一个公司内的各个部门,都使用公司资源。

然后我说网络、进程和协程是不同的。
线程和进程是在操作系统级别进行控制的,它们需要与系统进行交互。
但对于协程来说,它就像是程序本身组织的一个进程,不需要操作系统的干预。

他点点头,但表示不太明白。
让我举个例子。
比如我们看电视剧的时候,CPU就像是导演,顺序和流程就像是不同的剧集,而协程就像我们决定看哪一集,不用换台,只是在电视剧里跳来跳去。

他又问我,协程有什么用?我回答说,当电视剧中有太多的静态镜头时,比如演员说话,这时候不需要换镜头,而协程可以让这些不需要CPU运算的镜头流畅播放。

他说挺有趣,但是还是不太明白怎么实现。
我只能说,这部分我不太清楚,得找时间详细讨论。
没关系

Python使用协程的缺点

Python协程的缺点: 1 、单线程限制:多核CPU不能直接使用。
2 、阻塞问题:当I/O被阻塞时,整个程序都被阻塞。
3 . 性能瓶颈:适用于I/O密集型,而非CPU密集型。

示例代码: 蟒蛇 def func1 (): 对于我来说,在范围 (1 1 ) 内: print(f "一班打印{i}的数据); 产品def func2 (): g = func1 () 下一个 对我来说在范围(1 0)内: print(f "第二班打印第{i}条数据"); 下一个(s)
如果 __name__ == "__main__": func2 ()
总结:协程可以有效地处理 I/O 函数,但是 CPU 密集型应用程序应该考虑其他解决方案。

程序开发-Python和Golang中的进程、线程、协程原理和区别

说实话,这个东西太大了,不好说,但是试着拆解一下,看看有什么不同。
我们先来说说Python。
在过去的几年里我完成了很多Python 项目。
它的GIL(全局解释器锁)简直就是一颗定时炸弹——很多线程确实可以工作,但CPU密集型任务却像抢马桶座一样工作,而且本质上是串行的。
如果你使用多处理来绕过 GIL,你就必须重新发明轮子来进行进程间通信。
数据来回复制,性能损失巨大。
我有一个图像处理项目,我运行了多个进程。
不仅内存达到了1 00%,CPU使用率也只有5 0%,当时我就一头雾水。

回顾Golang,这个东西在我的职业生涯中出现得很晚,但是它可以提供一些东西。
它的goroutine只是一种尺寸缩减攻击——创建成本非常低,可以不经意地构建,并且只占用几KB的堆栈。
实际使用的有趣之处在于,运行 1 00 万个 Goroutine 只能占用几 MB 内存。
我有一个用 Go 编写的消息队列中间件。
实时启动时已经创建了数百万个 gorotin 监听端口,系统仍然像老狗一样稳定。
相比之下,虽然 Python 可以使用 asyncio 运行高并发,但它似乎始终与 Go 的内置语言分离。

协程调度的一个有趣的方面。
Python 的 Asincio 完全依赖于事件循环和回调,就像用鞭子抚摸玩具一样。
Golang 调度器更加智能。
它可以主动停止一个 Goroutine,然后切换到另一个 Goroutine。
它还可以防止特定的 goroutine 占用 CPU 时间过长。
我尝试过同时运行数千个查询。
Go 的响应时间稳定,但 Python 开始出现响应超时。

内存上的差异也很明显。
每个Python线程通常需要数百KB的堆栈空间,并且运行多个线程需要大量的内存开销。
在 Go 方面,初始堆栈只有 2 KB,并在需要时自动扩展。
当堆栈递减时,内核不需要干预。
我做了一个实验。
简单的CPU导向我使用Python运行一个函数,内存使用量稳步增加。
当我切换到 Go 时,内存曲线几乎像直线一样平坦。

最后说一下我的个人感受。
Python 非常灵活,并且有很多包,您无法全部使用它们。
编写脚本和进行数据科学是一种乐趣。
但如果你真的想提供高端会议服务,Go就无忧无虑了。
然而,Python 有一个明显的优势——社区很活跃,你基本上可以找到任何问题的现成答案。
尽管 Go 正在成长,但它仍然感觉有点落后。
因此,在选择技术时,应该考虑具体任务,而不是一概而论。