Gevent学习记录1

关于Gevent出现URLError: <urlopen error [Errno 66] unknown>错误:

学习的过程中,有些网址始终出现上面提示的那个错误,但用浏览器访问确实是正常的。

有网友提示说把gevent.monkey.patch_all(dns=false),经我实验后发现,这么改过后有些网址确实变得正常了,但有些网址却出现了其它比如time out、Network is unreachable等错误。

最终发现,由于用PIP方式安装的是'0.13.8’版本,最新的是1.0dev,更换版本后错误解决。

按照官方教程,代码如下:

import gevent
from gevent import monkey
monkey.patch_all()# 给标准socket打补丁
import urllib2
urls = ["http://dear-shen.com","http://www.baidu.com","http://www.hao123.com","http://www.sina.com","http://www.python.org"]
def print_head(url):
    print "start %s " % url
    data = urllib2.urlopen(url).read()
    print '%s: %s bytes: %r' % (url, len(data), data[:50])
if __name__ == '__main__':
    print "begin"
    jobs = [gevent.spawn(print_head, url) for url in urls] #spawn 第一个参数为要转换的函数,后面的是函数的参数,具体请看源码
    gevent.joinall(jobs)
    print "over"

输出结果如下:

begin
start http://dear-shen.com
start http://www.baidu.com
start http://www.hao123.com
start http://www.sina.com
start http://www.python.org
http://www.baidu.com: 11314 bytes: '<!DOCTYPE html><!--STATUS OK--><html><head><meta h'
http://www.sina.com: 19845 bytes: '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans'
http://www.hao123.com: 223684 bytes: '<!DOCTYPE html><!--[if lt IE 7 ]><html class="ie6"'
http://www.python.org: 20423 bytes: '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans'
http://dear-shen.com: 45559 bytes: '<!DOCTYPE html>n<html lang="zh-CN">n<head>n<meta c'
over

如果不加monkey.patch_all()、from gevent import monkey这两句的话其实并没有利用多线程,输出变成了:

begin
start http://dear-shen.com
http://dear-shen.com: 45559 bytes: '<!DOCTYPE html>n<html lang="zh-CN">n<head>n<meta c'
start http://www.baidu.com
http://www.baidu.com: 11314 bytes: '<!DOCTYPE html><!--STATUS OK--><html><head><meta h'
start http://www.hao123.com
http://www.hao123.com: 223729 bytes: '<!DOCTYPE html><!--[if lt IE 7 ]><html class="ie6"'
start http://www.sina.com
http://www.sina.com: 19845 bytes: '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans'
start http://www.python.org
http://www.python.org: 20423 bytes: '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans'
over

从上面两个输出对比,可以很清楚的看出调用函数的顺序。