什么叫进程?什么叫线程?

进程是程序执行的一个实例。
地址空间是独立的。
资源分配单元。
工控机通讯。
线程共享地址空间。
多个行动路径。
电缆切换速度很快。
进程切换速度慢。
线程同步很复杂。

进程、线程和协程之间的区别和联系

进程是具有独立地址空间的最小资源分配单元。
线程是进程内共享进程资源的执行单元。
协程是在线程内切换的轻量级用户模式任务。

切换进程有很大的开销,但是切换线程有一点开销。
切换协程不需要额外的内核开销,并且非常高效。

进程间通信复杂,线程之间共享资源,使用锁进行同步。
协程在线程内进行通信,无需锁定,只需评估状态。

创建进程的成本很高,但创建线程的成本也很高。
协程的开销极低,并且拥有更多线程的好处是显而易见的。

一个线程属于一个进程,而一个进程至少有线程。
协程在线程中执行,多个协程可以在单个线程中同时执行。

道路是流程,车道是流动,道路资源是共享的。
协程允许您在条带内灵活切换,而无需交叉条带。

一篇文章带你深度解析Python线程和进程

我记得几年前,我正在一家咖啡馆写代码,突然电脑屏幕上出现了一条重要的通知。
当我与同事进行视频通话时,我会快速保存进度并查看天气。
那一刻我突然意识到,电脑可以像人一样,一边吃饭一边接电话。
这不是多任务吗?然后我才知道这背后有一个进程和一个线程。

进程和线程就像我们生活中的两个工作部分。
过程是整车一边行驶,有发动机和自由空间,切换成本高但稳定;线程就是方向盘或者方向盘,共享汽车的资源,切换速度快但容易混乱。
例如,我打开浏览器并同时听音乐。
浏览器是一个进程,音乐播放器是一个线程。
他们分享回忆,独立行走。

操作系统是如何实现的?单核CPU通过快速切换让人感觉多个任务并行运行。
真正的并行性需要多核 CPU。
例如,我现在的计算机有四个核心,可以同时处理四个任务。
但任务比核心多,所以系统会智能地分配它们。
这就是并发和并行的区别:并发是多个宏观任务的调度,并行是微观任务的同时执行。

Python的多处理器模块可以让我们轻松创建进程。
例如,如果使用 Process(target=task, args=(data,)) 创建,则可以并行处理数据。
但进程间通信比较复杂,共享内存需要加锁,很容易导致死锁。
我尝试过使用队列通信来发送数据,例如信件。
虽然安全,但效率有时会降低。

纱线模块更加灵活。
使用Thread(target=task)创建线程,适合共享数据。
但是有一个叫做GIL(Global Interpreter Lock)的漏洞,会导致多线程在单核CPU上运行速度不快。
不过抓取网页时,线程遇到IO阻塞时会自动释放GIL,其他线程就会趁机执行,所以还是有用的。

锁定机制也很重要。
锁可以保证数据安全,但速度较慢。
RLock可以重复加锁,但如果使用不当会导致死锁。
当我写一个模拟抢票的时候,加锁后,即使一个线程只能进房间,也避免了数据混乱。
就像排队买票一样,缓慢但公平。

队列模块解决线程通信。
生产者放置数据,消费者检索数据,自动排队且线程安全。
我尝试着往Queue中插入一个线程,主线程去拿数据,就像接力赛一样顺利。
但是队列满了就会阻塞。
您可以使用超时来设置等待时间。

协程更小,转换成本更低。
Greenlet必须手动更改,而gevent可以自动处理IO。
我尝试过使用gevent来爬取使用过的房屋信息,遇到网络请求时会自动切换,效率高很多。
就像我一边走路一边说话,无需停下来重新开始。

我突然想到,如果计算机像人一样有大脑(CPU)和手脚(线程),那么协程是不是就像眼睛一样?您可以灵活地分散自己的注意力,而无需等到你看完某件事后再继续。
但如何获得电脑积分呢?这取决于算法吗?
现在电脑已经多核了,终于用上了多线程。
但是当代码运行时,谁来指挥它呢?是操作系统还是GIL?或许,就像我一边开车一边打电话一样,虽然我的大脑只处理一件事,但我的手和脚可以协同工作。
这背后的原理值得进一步研究。