并发
进程
特点:操作系统级别 开销大 数据隔离
资源分配的最小单位 数据不安全
可以利用多核
线程
特点:操作系统级别 开销小 数据共享
被cpu调度的最小单位 数据不安全
可以利用多核
协程
特点:用户级别 开销极小 数据共享的
不能利用多核 从代码级别来看数据安全
GIL:全局解释器锁 , Cpython解释器下的
,导致了同一进程中多个线程不能利用多核
相对安全 gc垃圾回收机制,不想加太多细粒度的锁
pypy : 解释器 gc垃圾回收机制,GIL锁
jython : python -->java的字节码 java的虚拟机解释 没有GIL 可以利用多核
一次IO操作
从文件读/从网络上读 :9ms = 9/1000
cpu计算速度 = 500000000/s * 9/1000 = 500000 *9 = 4500000条cpu指令
一句python代码 = 5条cpu指令
4500000/5 = 900000行python代码
import gevent
from gevent import monkey
monkey.patch_all()
import time
a = 0
def func():
global a
tmp = a
tmp += 1
time.sleep(1)
a = tmp
g1 = gevent.spawn(func)
g2 = gevent.spawn(func)
gevent.joinall([g1,g2])
print(a)
进程
你用过什么起进程的模块么?
multprocessing
concurrent.futrues 进程池
Process(target=func,args=(参数,)).start()
join()
ProcessPoolExcutor
为什么要起进程?
爬虫的时候 数据分析做的比较复杂 比较多 -- 开启多进程
为什么要爬虫?
线程
你用过多线程么? 用过、爬虫
django(默认就是线程)\socketserver(多线程+io多路复用)\flask(默认用协程,协程找不到,就用线程)
你知不知道python的GIL锁
这个锁有什么效果
你写代码的时候用到过哪些锁
互斥锁(只能acquire一次) 递归锁(在一个线程中acquire多次也不会死锁)
互斥锁 效率高、用好了也不会出错
logging queue list 是否线程安全
logging queue 线程安全
list 的所有方法都是线程安全的 append insert extend pop
list[0] += 1 线程不安全了
dict update setdefault 都是线程安全的
dic[key] += 1 线程不安全
协程
gevent asyncio
你用过协程么?
爬虫 aiohttp
web项目 sanic asyncio模块
线程和协程的区别
操作系统控制线程 程序员代码用户控制协程
协程的本质就是一条线程
线程对于IO操作的感知力更强 :打开文件 网络操作 时间模块
协程对于IO操作的感知力弱很多 :网络操作 时间操作
文件操作频繁的情况下 协程无法规避掉这部分io操作
协程有哪些模块?
gevent
acyncio :aiohttp sanic
C10K :connect 101024 = 1w并发
C10M :connect 101024*1024 = 1000w并发
负载均衡 nginx
分布式 celery