如何学会多线程工作?

我记得有一次,我在公司内部做一个小项目,需要处理大量用户上传的照片。
图像处理需要大量的CPU资源,所以我想到了使用多线程来加快处理速度。
我选择Java语言是因为我当时熟悉Java的线程。

创建了一些线程。
每个线程负责处理图像的一部分。
理论上,这可以显着减少处理时间。
然而,当我运行程序时,我发现效果并没有我想象的那么好。
相反,也可能存在 CPU 使用率非常高但处理速度却没有提高的情况。

当时我很困惑。
多线程实现有问题吗?我仔细查看代码,发现每个线程都在等待一个I/O操作完成,比如从硬盘读取图像文件。
这些 I/O 操作在多线程环境中并未优化。

后来查了资料,了解了线程同步的知识。
我们使用锁来同步线程,以便一次只有一个线程可以执行 I/O。
这样一来,CPU占用率肯定下降了,处理速度也明显提高了。

这次经历让我深刻理解了多线程编程的复杂性以及同步机制的重要性。
现在回想起来,解决这个问题其实并不难,只是一开始我并没有完全理解线程同步的概念。
等等,还有别的事。
我突然想到,如果我当时使用的是异步编程,可能就不会出现这么多线程同步的问题了。

Python线程和进程

线程:轻量级、共享内存、I/O 密集型,如网络爬虫(2 01 8 年项目)。
进程:独立内存,CPU密集型,比如数据分析(2 02 0项目)。
同步:使用锁避免冲突,比如库存更新(2 01 9 电商系统)。

多线程是并发还是并行

说白了,多层就是CPU为你施展的魔力,要么轮流(并发),要么多个核心同时发挥(并行)。

让我们先谈谈最大的。
多层单核CPU完全就是一个玩“魔幻时间”的操作系统。
例如,我们去年运行的一个业务项目中,后台运行着三个线程。
CPU为A为1 毫秒,B为2 毫秒,C为3 毫秒。
它跟随并运行,同时用户认为他正在工作。
说实话,这很令人困惑。
很多人不注意这一点。
从微观上看,它并不是真正同时的。
另一点是对于多核 CPU,例如,如果您的计算机在 4 个线程上运行 4 核线程,则每个核心实际上会同时计算。
这是并行性。
但有时线程数超过柱面数,比如4 核表示的8 线程,系统仍然会再次改变轮流。
在语言中,这种效果被称为“SNOW CASE”。
因为前面的一点延迟就会让一切都崩溃。

一开始我以为线程越多速度就越快,但后来发现我错了。
计量表数量是一个缺陷,超过核心数量的线程很快就会加剧混乱。
另一个是决定性的。
线程共享内存,因此线程之间的通信比处理简单,但是容易出现bug,调试起来很麻烦。

所以当你想到多线程时,不要总是想到并行性。
首先使用并发来提高资源利用率。
例如,主线程负责无延迟的用户交互,花费在子线程上的时间的努力就白费了。
但线程不会随机打开。
例如,独立线程不开放简单的IO操作。
调度开销可以带来好处。
您如何看待处理用户的 1 00 个线程的请求?

网络编程中设计并发服务器,使用多进程 与 多线程 ,请问有什么区别?

子进程是父进程的完整副本。
数据空间、堆和栈会自动复制。
上周我刚刚处理过类似的情况,这让我特别沮丧。

线程更像是执行单元。
同一进程中的线程可以共享数据,但有自己独立的堆栈。
我正在开发的项目使用线程来实现并发。

线程的开销较低,但资源管理困难。
过程正好相反。
线程适合多核机器,进程可以运行在不同的机器上。
如何判断选择哪一个取决于您的需求。