多线程

本文深入探讨了并行与并发的概念,包括CPU执行任务的原理,超线程技术,以及多进程、多线程和多协程的区别。详细分析了各种并发模型的特点,如互斥锁、GIL全局解释器锁的作用,以及异步IO处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个CPU在同一个时间片,只能执行一个任务。
并行 : 多个CPU同时执行多个任务(CPU >= 任务数)
C10K
Intel 超线程 : 一个CPU核心,可以有两个任务执行单元
AMD

并发 : 单个CPU需要执行多个任务 (CPU < 任务数)
多进程 :multiprocessing 并行
每个进程都有自己独立的内存空间,不同进程不能共享内存空间,所以多进程的任务开销太大。
多线程 :threading、并发
多个线程共享同一个进程的内存空间,数据通信、信号、切换开销极小。 抢占式获取系统资源
互斥锁:让多个线程安全有序的访问内存空间的机制。

GIL 全局解释器锁:在一个解释器环境下,一次只能运行一个线程。
从根本上杜绝了多个线程访问内存空间的安全问题。

GIL 在IO阻塞的时候,会自动释放,尝试让其他线程工作。

多协程 : 并发
协程 本质是 函数/方法,由程序员调度。
gevent
gevent.monkey.patch_all()
将Python底层的网络库(socket、select)打个补丁,让他们在处理网络IO的时候,按异步的方式执行。
同步、异步 : 执行方式
阻塞、非阻塞 : 执行状态

1 迭代list的每个元素,并将元素做为参数传递给func执行,最后将所有的返回值统一保存在 resutl_list
result_list = pool.map(func, list, list)

2 迭代list的每个元素,并将元素做为参数传递给func执行,最后将所有的返回值的列表一起传递给callback处理
pool.map_async(func, list, callback)

3 将args做为参数传递给func执行(apply是同步阻塞方式执行,不是异步)
result = pool.apply(func, args)

4 将args做为参数传递给func执行,并将返回值传递给callback执行
pool.apply_async(func, args, callback)

协程池不需要close
pool.close()
pool.join()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值