用gevent创建协程前,我们一般进行打补丁,为了遇到延时操作不报错。但如果和进程池混合使用,就会在创建池子时程序卡住,不再往下执行。
此时把补丁去掉,并且不要用延时操作,程序就能继续执行,下载这种耗时过程,完全不需要打补丁且不会报错的 。
如果不用补丁,gevent根本不认识延时操作,所创建的不是协程,只是多进程而已。。。。。。。。。。。。。。。。
下面是爬取图片的代码,代码A用的进程加协程爬取:速度明显高于只用协程
代码B用的是协程,时间长了好多
代码A
进程池与协程
from multiprocessing import Pool,Manager
import gevent
import time
# from gevent import monkey
import urllib.request
import re
# 打补丁
# monkey.patch_all() # 有进程池,所以把补丁去掉,要不在创建池子时卡住
def my_download(name,url):
"""下载并保存"""
# 请求
resp = urllib.request.urlopen(url)
# 读取数据
data = resp.read()
# 保存
with open("/home/python/Desktop/mi_zi_1/"+ name,"wb") as f:
f.write(data)
def get_html(q,url,k):
"""解析出图片网址"""
# 打开文件获取源码
resp = urllib.request.urlopen(url)
data = resp.read()
# 正则匹配出图片网址
urls = re.findall(r"//.*?large.*?\.jpg", data.decode("utf-8"))
# 统计图片个数
count = len(urls)
q.put