import time
from queue import Queue # 用于创建队列任务
import threading # 多线程
import redis # redis 模块
q=Queue() # 队列列表
red=redis.ConnectionPool(host="localhost",port=6379) # redis 连接池
r=redis.Redis(connection_pool=red) # redis 连接池实例
def gup(): # 生产者,产生任务丢到远程redis 维护一个队列,用于替代queue
for x in range(100):
r.lpush("list",x)
def gget():
while True: # 进来首先判断一次列表长度,度过为0表示队列空了,退出
ll=r.llen("list")
print(ll)
if ll==0:
break
try: # 增加代码健壮性
a=r.lpop("list") # 维护的list 栈中弹出左侧的key
print(a)
time.sleep(2)
except Exception as e:
print(e)
continue
def ma():
for x in range(10): # 创建10个线程 ,充当线程池作用
th=threading.Thread(target=gget)
th.start()
th.join()
if __name__ == '__main__':
gup()
time.sleep(1)
ma()
代码很少,原理也挺简单的, 先用一个方法,生成任务,丢到redis里面进行维护, 然后用多线程,每次线程开始的时候都去查询redis 维护的栈(list)中是否为空, 不为空就代表有数据,那么就弹出第一个,如果为空就退出当前while ,结束当前进程 通过redis 来代替本地的queue队列,实现分布式,实现不复杂, 配合requests就可以实现自己diy的分布式爬虫。