Monthly Archives: 02月 2011

Firefox里javascript的表达式闭包

先看段js代码,下面这个语句会报错吗? function (x) function (x) function(x) function(x) {} 实际情况是,在Firefox3+不会报错,而在Chrome、IE里会报错。这是Friefox3里新增的javascript表达式闭包,是闭包函数的简写法。上述代码相当于: function (x) { return function(x){ return function(x){ return function(x){} }; }; } 可见表达式闭包在写简单函数时会很方便。再看看,这种写法不就是python里的lambda函数吗? 简单写了一个模拟python里装饰器功能的东西: var test_func = function(a) { alert(a); }; var wrapper_func = function (x) function (y) { alert(‘before’); x(y); … 繼續閱讀

发表在 dev, javascript | 发表评论

urllib2的随机http代理handler

对于使用urllib2抓取网页的程序,如果使用代理,一般都使用urllib2.ProxyHandler这个handler。而这个handler必须在初始化时指定一个代理服务器(可以是http和https各一个),然后通过urllib2.build_opener和urllib2.install_opener安装到urllib2种,之后再去用urllib2.urlopen去抓页面。 这样做只能使用一个代理服务器,但如果我们要在不停地调用urllib2.urlopen时使用随机多个代理服务器呢?用urllib2.ProxyHandler的话就只能每次抓页面前重新初始化opener,这样做的性能是不能让人容忍的。 如果查阅下urllib2的代码,就会发现它每次抓网页时,是去调urllib2.ProxyHandler的http_open(https同理)方法为http头加了几个代理服务器字段。如果我们派生出一个类,覆盖掉urllib2.ProxyHandler的http_open方法,实现上改为每次随机取代理地址,不就ok了么? 下面是具体实现代码,测试通过: #!/usr/bin/env python # coding:utf-8 # yc@2012-2-23 import urllib2, random, base64 from urllib import unquote DEBUG = False class RandomProxyHandler(urllib2.ProxyHandler): ”’ 随机http代理handler ”’ def __init__(self, proxies=None): ”’ proxies为一个seq,每项为一个http代理,如:’proxy.example.com:3128′ 或 ‘http://joe:password@proxy.example.com’ ”’ self.proxies = [urllib2._parse_proxy(i) for i in … 繼續閱讀

发表在 dev, python | 1条评论

线程安全的python生成器: yield

在多线程编程中,大部分情况下我们都得使用资源锁,否则程序的行为会千奇百怪。比如多个线程公用一个socket连接而在使用时不加锁的话,发送和接收的数据包顺序有可能会被打乱。 写多线程的python程序,大多使用了threading模块的Lock、RLock或Condition类来作资源锁。使用共享资源时加锁,使用完毕后释放锁,当程序逻辑很复杂时,资源锁的控制也会变得越来越复杂,由此导致的bug也不断增多。 这里介绍一种不用锁机制去访问共享资源的方法,那就是使用python中的生成器,也就是使用了yield指令的函数。 按照锁机制中经典的生产者、消费者模型编写的生成器代码大致如下: #coding:utf-8 import threading, random, time def producer(): x = 0 while x < 60: x += 1 time.sleep(random.random()) yield x y = producer() def consumer(): while True: try: x = y.next() except: break print x for … 繼續閱讀

发表在 dev, python | 发表评论

Hello world!

Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!

发表在 未分类 | 1条评论