博采众长,精于一技。Live for love, work for dream.

Python Queue阻塞引发变量污染

大家先来看一段代码:
# -*- coding: utf-8 -*-
'''
Created on 2012-3-01

@author: rebill
'''
from multiprocessing import JoinableQueue, Process
import time

class C1(Process):
    def __init__(self, queue):
        Process.__init__(self)
        self.queue = queue
        
    def run(self):
        for i in xrange(3):
            data = {'a':i}
            self.queue.put(data)
#            time.sleep(0.1)
            data['b'] = i
            self.queue.put(data)
    
class C2(Process):
    def __init__(self, queue):
        Process.__init__(self)
        self.queue = queue
        
    def run(self):
        while True:
            item = self.queue.get()
            if item != None:
                print item
                self.queue.task_done()        
    
if __name__ == '__main__':
    queue = JoinableQueue()
    
    c1 = C1(queue)
    c1.start()
    
    c2 = C2(queue)
    c2.start()
    
    queue.join()

预期的结果应该是这样:
{'a': 0}
{'a': 0, 'b': 0}
{'a': 1}
{'a': 1, 'b': 1}
{'a': 2}
{'a': 2, 'b': 2}

但事实往往出乎你的意料,真正的输出应该是:
{'a': 0, 'b': 0}
{'a': 0, 'b': 0}
{'a': 1, 'b': 1}
{'a': 1, 'b': 1}
{'a': 2, 'b': 2}
{'a': 2, 'b': 2}

为什么会导致变量被污染了呢?
细心的你,应该看到我注释的代码
time.sleep(0.1)

没错,Python的Queue会阻塞,不过又不是全阻塞,它是半阻塞。就算你把queue.put换成queue.put_nowait(),结果还是一样的。但是在实际的生产环境中,你不可能加上time.sleep(0.1)这样的代码,解决的办法就是将两次put的变量名换成不一样的,防止变量被污染。
像这样:
data_a = {'a':i}
self.queue.put(data_a)
data_b  = {'a':i, 'b':i}
self.queue.put(data_b)

或者你有什么其他更好的办法呢?欢迎一起探讨。

CDNZZ使用教程

1.CDNZZ简介
什么是CDN?请看百度百科
CDNZZ是一家新兴的提供全球互联网加速的云服务提供商。目前提供的加速节点有香港和美国。

2.注册
由于目前处于邀请注册阶段,所以注册需要邀请码。这里我发几个邀请码(更多CDNZZ优惠码,请到该页面获取,不定期更新哦):
175978155 
134083106 
156271694 
132994503 
141586923 
162298974 
150222360 
110167678 
167059747 
148651292

注册成功后会收到一封激活邮件,激活帐号后就可以使用了。

3.添加域名
点击网页顶部导航 website添加域名,域名添加后,要求下载一个html文件放到网站的根目录进行域名所有权验证。域名所有权验证过后才能进行下一步操作。

4.CDN设置
具体设置如下图:
cdn_setting.jpg
说明:
Host name:你需要加速的二级域名
Website Source IP: 你的网站的服务器IP地址
CNAME:这个是系统自动生成的,下一步设置DNS的时候需要用到

5.DNS设置
以DNSPOD为例,添加上一步系统生成的CNAME,然后保存。
dns_setting.jpg

等待域名生效,尽情享受加速吧。

Ubuntu 安装 Redis,并配置开机启动

1、下载安装Redis:
cd /tmp
wget http://redis.googlecode.com/files/redis-2.4.6.tar.gz
tar -zxf redis-2.4.6.tar.gz
cd redis-2.4.6
make
sudo make install

2. 配置init脚本:
wget https://github.com/ijonas/dotfiles/raw/master/etc/init.d/redis-server
wget https://github.com/ijonas/dotfiles/raw/master/etc/redis.conf
sudo mv redis-server /etc/init.d/redis-server
sudo chmod +x /etc/init.d/redis-server
sudo mv redis.conf /etc/redis.conf

3. 初始化用户和日志路径
第一次启动Redis前,建议为Redis单独建立一个用户,并新建data和日志文件夹
sudo useradd redis
sudo mkdir -p /var/lib/redis
sudo mkdir -p /var/log/redis
sudo chown redis.redis /var/lib/redis
sudo chown redis.redis /var/log/redis

4、设置开机自动启动,关机自动关闭
update-rc.d redis-server defaults

5、启动Redis:
/etc/init.d/redis-server start

Linux下的SecureCRT破解方法[无效]

经测试,以下方法无效,请毋往下看,以免浪费大家时间。
看到人家说Mac下的SecureCRT可以破解,一时手痒,看看Linux下能不能破解,于是有了下文。

0.从官网下载Linux版的SecureCRT,并安装
1.运行SecureCRT,输入License
SecureCRT6.7.* License 注册码 序列号
Name: Sherrill Ray  
Company:  
Serial Number:03-40-084141  
License Key: ABWGUE ZPPZ6X XHTN2S 1N7PER AB39ZJ PX3312 WS6BZF GHN2ET  
Issue Date: 10-26-2002
Name: Richard P Merrell
Company:   
Serial Number: 03-41-000899   
License key: AD84V4 B3SYMS HEC6JM 1JNFH8 AAEBCS FNY2PK AT3S6M 4ZYQFB   
Issue Date: 09-02-2003

注册完成后,会在用户目录生成一个叫SecureCRT.lic的文件。
用户目录因人而异,我的用户目录路径为/home/rebill/.vandyke/Config
2.SecureCRT破解
再次运行SecureCRT,如果仍然提示30天后过期的话,执行该命令
cd /home/rebill/.vandyke/Config
cp SecureCRT.lic SecureCRT_eval.lic

Enjoy it. 本次测试基于Ubuntu 11.04,其他版本Linux或Unix应该会适用

返回顶部