hello啊,各位觀眾姥爺們!!!本baby今天來報道了!哈哈哈哈哈嗝🐶
面試官:并行跟并發有什么區別?
并發 vs 并行:核心區別與場景
1. 定義對比
維度 | 并發(Concurrency) | 并行(Parallelism) |
---|---|---|
核心 | 處理多任務的能力(不要求同時執行) | 同時執行多任務(物理上同步) |
資源依賴 | 單核即可實現(通過時間片切換) | 必須依賴多核/多機(如GPU、分布式集群) |
目標 | 提高資源利用率(如IO阻塞時切換任務) | 縮短任務完成時間(拆分任務并行計算) |
2. 典型場景
- 并發
- Web服務器同時處理上千請求(Nginx通過事件循環單線程響應)。
- 下載文件時同時更新UI進度條(主線程與后臺線程交替執行)。
- 并行
- 圖像渲染使用GPU的數千核心并行計算。
- Hadoop將大數據作業拆分到多臺機器并行處理。
3. 技術實現
- 并發控制
- 鎖機制:
synchronized
、ReentrantLock
(避免競態條件)。 - 無鎖編程:CAS(如
AtomicInteger
)、Disruptor環形隊列。
- 鎖機制:
- 并行框架
- 多線程:Java的
ForkJoinPool
、C++的OpenMP。 - 分布式:Spark RDD、MPI(消息傳遞接口)。
- 多線程:Java的
4. 性能瓶頸
問題類型 | 并發 | 并行 |
---|---|---|
常見挑戰 | 死鎖、線程切換開銷、資源競爭 | 任務拆分不均、通信延遲、同步成本高 |
優化手段 | 協程(減少上下文切換)、異步IO | 負載均衡(如Work Stealing算法) |
5. 代碼示例
并發(交替執行)
# 單核CPU通過時間片處理兩個線程
import threadingdef task1():while True: print("Task1")def task2():while True: print("Task2")threading.Thread(target=task1).start()
threading.Thread(target=task2).start()
# 輸出交替打印,但實際任一時刻只有一個線程在運行
并行(同時執行)
# 多核CPU同時執行兩個進程
from multiprocessing import Processdef task1():while True: print("Task1")def task2():while True: print("Task2")if __name__ == '__main__':Process(target=task1).start()Process(target=task2).start()
# 兩個進程可能同時在不同核心上運行
6. 關聯與協同
- 并發是并行的基礎:多線程程序在多核CPU上可轉為并行。
- Amdahl定律:并行加速比受限于程序中必須串行的部分。
S p e e d u p ≤ 1 1 ? P + P N Speedup \leq \frac{1}{1 - P + \frac{P}{N}} Speedup≤1?P+NP?1?
(P為并行比例,N為處理器數量)
總結
- 選型建議:
- IO密集型(如網絡請求)→ 優先并發(協程/異步)。
- CPU密集型(如科學計算)→ 優先并行(多進程/分布式)。
- 誤區:
增加線程數 ≠ 提升并行度(線程數超過CPU核心數可能引發頻繁切換,反而降低性能)。