python GIL锁
同步线程的一种机制,即使在多处理器也是仅有一个线程在执行
避免GIL
用multiprocessing替代Thread
用多进程代替多线程,每个进程有自己的独立的GIL,不会出现进程之间的GIL争抢。
多进程的创建和销毁开销也会更大,成本高
LOCK锁 原子操作
一步是计算,一步的赋值,所以不是+1-1,a=0+1=1 b=0-1=-1 number=b number=a
因为时分GIL操纵,还没赋值就变成计算了,要实现的话,自己在累加前面添加锁
look.acquire(),最后必须解锁look.release()
递归锁RLOCK
只有拿到锁的线程才能释放,同一线程可以多次拿到锁
多进程
命令一样,名字改成multiprocessing.process()
进程通信
python多进程之间默认无法通信,因为是并发执行的,所以需要借助其他数据结构
进程池和线程池 优化操作(可用)
(processes=X)X为大小
右边代码就是逐步提交,左边是提交100个同时进行
线程池
pip install threadpool
单线程30S的任务,10线程并发3秒完成
异步编程
concurrent futures模块
单线程执行CPU密集型,线程池执行也是时间是一样的
是因为多个CPU多核,但是只在一个进程里GIL锁,所以也只能有一个在进行
CPU运行的,用多进程,不要用多线程。
IO密集型才用多线程。
异步爬虫
一般函数用concurrent
分布式Python编程
大任务分布分散成小任务,兼容不同环境的框架如Celery
就是一个中转站
Celery入门程序
定义任务dealy 异步提交任务
AsyncResult会等待任务返回
get取得结果
标签:异步,多线程,爬虫,线程,进程,GIL,CPU From: https://www.cnblogs.com/JWmorning/p/17644343.html