多线程爬虫

墨柠C / 2023-08-20 / 原文

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取得结果