當Deferred遇上Thread

當Deferred遇上Thread Deferred不會自動實現將阻塞過程轉為非阻塞過程,雖然它已經有那樣的機制但還是要你去多走一步。要將阻塞過程轉為真正的非阻塞過程,那 只有借用線程。但至於線程調用你不用太擔心,twisted已為你準備好一個方便的用法。就是將Deferred綁在Thread上,這樣就有了deferToThread,味道不比牛奶加巧克力差。 deferToThread在twisted文檔的說明,洋墨水喝得比較少,就不照字面翻譯了。大概意思是將函數f放在線程裡並作為Deferred返回,args和kwargs是函數f的參數。也就是使用deferToThread返回的是一個帶線程的Deferred,並自動使用callback調用指定的函數f。相當於在線程中運行下面的代碼 d=defer.Deferred().addCallback(f) d.callback(result) def deferToThread(f, *args, **kwargs): (source) Run a function in a thread and return the result as a Deferred. Parameters f The function to call. *args positional arguments to pass to f. **kwargs keyword arguments to pass to f. Returns A Deferred which fires a callback with the result of f, or an errback with a twisted.python.failure.Failure if f throws an exception. #!/usr/bin/env python #coding=utf-8 from twisted....

2009-12-04 · 1 分钟 · admin

Deferred筆記一

Deferred的簡單套路 從twisted的文檔入手,將Deferred獨立出來簡單的說明作用與使用方法,這樣更能快速對Deferred有深刻的了解。 一、學習資料 1、主要參考資料 官方文檔 http://twistedmatrix.com/projects/core/documentation/howto/deferredindepth.html 關聯譯文 http://wiki.woodpecker.org.cn/moin/twistedTUT00?action=AttachFile&do;=get⌖=deferred_tutorial.html(此鏈接將會下載離線文檔) 2、關聯資源 http://wiki.woodpecker.org.cn/moin/TwistedTUT 二、Deferred的作用 Deferred的主要作用可以用一句話比較形象說明,“不要打電話給我,我會打給你的(Don’t Call Us, We’ll Call You)”。相當於做好計劃後,執行交給Deferred,完成後再找我,我可要到一邊Happy去了。 它會根據callback運行結果(正常、發生例外)從callback鏈表中選擇執行已註冊的相應的callback函數,從而實現事件方式來驅動程序。 callback的運行不影響主程序的運行,Deferred.callback執行後馬上返回。(這點有待在後面證明) 三、Deferred實例 from twisted.internet import defer d=defer.Deferred() 實例化後就可以對Deferred進行操作。 四、callback鏈表 鏈表是用來放置callback函數,鏈表中的函數可以響應三類事件,正常結束、例外結束、任意(包括前面兩者),它們分別用addCallback、addErrback、addBoth註冊到鏈表中。也就是說函數正常結束返回調用addCallback註冊的函數,發生例外則調用addErrback註冊的函數,使用addBoth註冊的函數無論返回什 結果都會被調用。 五、callback函數註冊 除了上面提過的addCallback、addErrback、addBoth三個註冊函數外,還有另外一個addCallbacks可以同時註冊處理正常結束和例外結束的函數。 1 2 3 4 5 6 def deferredExample(): d = defer.Deferred() d.addCallback(failAtHandlingResult) d.addCallbacks(yesDecision, noDecisionPassthru) d.addCallback(handleResult) # - A - d.addErrback(handleFailure) 上面代碼中第4行的addCallbacks效果如同 d.addCallback(yesDecision) d.addErrback(noDecisionPassthru) 另外,我們也可以將註冊過程寫成下面形式。 d=refer.Deferred().addCallback(failAtHandlingResult).addCallbacks(yesDecision, noDecisionPassthru).addCallback(handleResult).addErrback(handleFailure) 六、callback鏈執行順序 Deferred的鏈表是按順序從第一個註冊函數開始直到最後一個函數。如果發生例外時,有多個例外處理函數,則會調用發生例外函數下面第一個例外處理函數。後面的例外處理函數將不會被調用,除非第一個例外處理函數將這個例外向下傳遞。 七、其它一些特性 Deferred實例中還有另外一些函數,如pause,unpause,setTimeout,timeoutCall,chainDeferred,這些將留作下一步的測試。 另外還沒涉及到的是Deferred上一級的defer庫中的函數及其它類的使用,從一些代碼看來這些函數將會進一步有利於Deferred的應用,但這也有待後面的進上步學習。 八、總結 經過Deferred are beautiful一節學習,了解Deferred的使用方法及其事件響應機制。 創建於2009年8月31日 原文 http://sites.google.com/site/mypynotes/twisted-1/deferred 可以被gw了

2009-12-04 · 1 分钟 · admin

Python 语法运用

u=[“a”,“b”,“c”] l = [“name=%s” % user for user in u ] 结果: [“name=a”, “name=b”,“name=c”] l ={“a”:1,“b”:2,“c”:3} [k for k,v in l.items()] 结果: [“a”,“b”,“c”] l ={“a”:1,“b”:2,“c”:3} ["%s=%s" % (k,v) for k,v in l.items()] [“a=1”,“b=2”,“c=3”] 2.lambda lambda 是预代理,代替要生成方法的指针,我这样理解的 d.addCallback(lambda m: "status of %s : %s" % (msg,m)) d.addCallback(lambda m: self.msg(user,m)) 3.文件的操作 这是方指的是txt文件操作 注意路径只能是 / 的方式处理, 打开的模式,你可以采用 help(file)的方式来查. f = file(“c:/tmp/abc.txt”,“r”) for line in f: user,status = line.split(":",1) user = user.strip() status = status....

2009-12-03 · 1 分钟 · admin

python的dict,set,list,tuple应用

字典(dict) dict 用 {} 包围 dict.keys(),dict.values(),dict.items() hash(obj)返回obj的哈希值,如果返回表示可以作为dict的key del 或 dict.pop可以删除一个item,clear清除所有的内容 sorted(dict)可以吧dict排序 dict.get()可以查找没存在的key,dict.[]不可以 dict.setdefault() 检查字典中是否含有某键。 如果字典中这个键存在,你可以取到它的值。 如果所找的键在字典中不存在,你可以给这个键赋默认值并返回此值。 {}.fromkeys()创建一个dict,例如: {}.fromkeys((’love’, ‘honor’), True) =>{’love’: True, ‘honor’: True} 不允许一个键对应多个值 键值必须是哈希的,用hash()测试 一个对象,如果实现hash()方法可以作为键值使用 集合(set) 集合是一个数学概念,用set()创建 set.add(),set.update.set.remove,添加更新删除,-= 可以做set减法 set.discard 和 set.remove不同在于如果删除的元素不在集合内,discard不报错,remove 报错 < <= 表示 子集,> >=表示超集 | 表示联合 & 表示交集 - 表示差集 ^ 差分集里啊 列表(list) 列表是序列对象,可包含任意的Python数据信息,如字符串、数字、列表、元组等。列表的数据是可变的,我们可通过对象方法对列表中的数据进行增加、修改、删除等操作。可以通过list(seq)函数把一个序列类型转换成一个列表。 append(x) 在列表尾部追加单个对象x。使用多个参数会引起异常。 count(x) 返回对象x在列表中出现的次数。 extend(L) 将列表L中的表项添加到列表中。返回None。 Index(x) 返回列表中匹配对象x的第一个列表项的索引。无匹配元素时产生异常。 insert(i,x) 在索引为i的元素前插入对象x。如list.insert(0,x)在第一项前插入对象。返回None。 pop(x) 删除列表中索引为x的表项,并返回该表项的值。若未指定索引,pop返回列表最后一项。 remove(x) 删除列表中匹配对象x的第一个元素。匹配元素时产生异常。返回None。 reverse() 颠倒列表元素的顺序。 sort() 对列表排序,返回none。bisect模块可用于排序列表项的添加和删除。 元组(tuple) tuple=(1,),这是单个元素的元组表示,需加额外的逗号。 tuple=1,2,3,4,这也可以是一个元组,在不使用圆括号而不会导致混淆时,Python允许不使用圆括号的元组。 和列表一样,可对元组进行索引、分片、连接和重复。也可用len()求元组长度。...

2009-12-03 · 1 分钟 · admin

Deferred Object In Twisted

Twisted uses the Deferred object to manage the callback sequence. The client application attaches a series of functions to the deferred to be called in order when the results of the asychronous request are available(this series of functions is known as a series of callbacks, or a callback chain), together with a series of functions to be called if there is an error in the asychronous request(known as a series of errbacks or an errback chain)....

2009-12-03 · 6 分钟 · admin

Python 类型

1.Dictionry {} 相录于一个 key value的内容 mys={“a”:1,“b”:2,“c”:3} mys[“a”] = 1 mys.keys() mys.values() for k,v in mys.items(): print k,v 2.List 是一个列表 [] mys=[“a”,“b”,1] mys[0] mys[1] mys[-1] for v in mys: print v; Tuple 一个不能改变的list () mys=(1,2,“a”) mys[0] mys[1] for v in mys: print v; 这三种类型可以完全结合 mys=[(2,3),(4,5),(“a”,“b”)] mys={“a”:[2,3,4],“b”:[3,4,5]} mys[“a”].pop() 可以这样的写。

2009-12-03 · 1 分钟 · admin

进程信号

转载:http://blog.csdn.net/ljx0305/archive/2008/09/09/2904056.aspx SIGHUP 终止进程 终端线路挂断 SIGINT 终止进程 中断进程 SIGQUIT 建立CORE文件终止进程,并且生成core文件 SIGILL 建立CORE文件 非法指令 SIGTRAP 建立CORE文件 跟踪自陷 SIGBUS 建立CORE文件 总线错误 SIGSEGV 建立CORE文件 段非法错误 SIGFPE 建立CORE文件 浮点异常 SIGIOT 建立CORE文件 执行I/O自陷 SIGKILL 终止进程 杀死进程 SIGPIPE 终止进程 向一个没有读进程的管道写数据 SIGALARM 终止进程 计时器到时 SIGTERM 终止进程 软件终止信号 SIGSTOP 停止进程 非终端来的停止信号 SIGTSTP 停止进程 终端来的停止信号 SIGCONT 忽略信号 继续执行一个停止的进程 SIGURG 忽略信号 I/O紧急信号 SIGIO 忽略信号 描述符上可以进行I/O SIGCHLD 忽略信号 当子进程停止或退出时通知父进程 SIGTTOU 停止进程 后台进程写终端 SIGTTIN 停止进程 后台进程读终端 SIGXGPU 终止进程 CPU时限超时 SIGXFSZ 终止进程 文件长度过长 SIGWINCH 忽略信号 窗口大小发生变化 SIGPROF 终止进程 统计分布图用计时器到时 SIGUSR1 终止进程 用户定义信号1 SIGUSR2 终止进程 用户定义信号2 SIGVTALRM 终止进程 虚拟计时器到时...

2009-11-30 · 1 分钟 · admin

用Python写简单守护进程【转】

[转载自]http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/ I’ve written a simple Python class for creating daemons on unix/linux systems. It was pieced together for various other examples, mostly corrections to various Python Cookbook articles and a couple of examples posted to the Python mailing lists. It has support for a pidfile to keep track of the process. I hope it’s useful to someone. Below is the Daemon class. To use it, simply subclass it and implement the run() method....

2009-11-28 · 3 分钟 · admin

Django and Memcached

just ran into several problems while setting up memcached for a django installation, that is replicated over several servers. One of the problems was the compiling of cmemcache, a python extension for libmemcache, where I received the following error: ‘CmemcacheObject’ has no member named ‘mc_ctxt’ First I didn’t realized the additional file, that resides at the file list of downloadable cmemcache versions. With this file you can patch the libmemcache library so cmemcache can be build....

2009-11-28 · 3 分钟 · admin

Xtrabackup备份和恢复MySQL

Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。Xtrabackup中包含两个工具: * xtrabackup - 用于热备份innodb, xtradb表的工具,不能备份其他表。 * innobackupex - 对xtrabackup封装的perl脚本,提供了myisam表备份的能力。 Xtrabackup可以做什么 * 在线(热)备份整个库的InnoDB, XtraDB表 * 在xtrabackup的上一次整库备份基础上做增量备份(innodb only) * 以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用) Xtrabackup如何工作的 * xtrabackup - 具体原理有待研究。。。 * innobackupex整库备份 1. 调用xtrabackup对innodb表空间文件(这一瞬间的映像Time1)备份,而在这个innodb表备份期间数据库是不加锁的,外部可以继续往库里增减数据(这才能叫热备份)。而在Time1和Time2这两个时间点之间的改动由一个线程不断地扫innodb log获得(ChangeSet1)。 2. 锁所有库。 3. 以直接拷贝的方式备份frm,MYD,MYI,MRG,TRG,TRN,opt格式的文件。 4. 步骤3中的数据备份完毕时(Time2),停止扫innodb log的线程,把ChangeSet1的数据拷贝到备份中。 5. 解锁所有库。 6. 终止挂起,备份完毕。 注意要点 * 根据innobackupex的原理可知它不是真正的热备份,MyISAM表越少越小就越有利。要利用Xtrabackup的好处就尽量用innodb表。 * 还原备份前关闭mysql服务;还原备份后检查数据文件权限是否正确。 * 性能:备份一个数据目录总大小5.6G,其中ibdata 2G,总时间4分钟,锁表时间2.5分钟。如果用mysqldump做这个库的备份锁表时间是5-8倍。 安装 tar zxf xtrabackup-0.7.tar.gz cd xtrabackup-0.7 ./configure make 进行到这里时,千万别惯性使用make install,那样就会接着安装MySQL了,正确方法是接着: cd innobase/xtrabackup/ make make install 然后,就会在你的/usr/bin目录里安装上两个工具:xtrabackup,innobackupex-1.5.1 制定备份多个数据库 innobackupex-1.5.1 --user=root --databases="innodb innodb2" /bak/ 压缩备份(不加–databases,默认全部数据库) innobackupex-1....

2009-11-24 · 1 分钟 · admin

TCP连接状态

CLOSED: 表示初始状态。 LISTEN: 表示服务器端的某个SOCKET处于监听状态,可以接受连接。 SYN_SENT:在服务端监听后,客户端SOCKET执行CONNECT连接时,客户端发送SYN报文,此时客户端就进入SYN_SENT状态,等待服务端的确认 SYN_RCVD: 表示服务端接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。 ESTABLISHED:表示连接已经建立了。 FIN_WAIT_1: 这个是已经建立连接之后,其中一方请求终止连接,等待对方的FIN报文。FIN_WAIT_1状态是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。 FIN_WAIT_2:实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。 TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。 CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。 CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。 LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。

2009-11-22 · 1 分钟 · admin

windows下开发并编译PHP扩展(步骤说明)

开发PHP扩展对于普通程序员来讲可能一直是一件很神秘的工作,其实,只要你对C语言熟悉,了解了开发PHP扩展的步骤和规则,开发PHP扩展也是一件很普通的工作。 现在就简单说一在WINDOWS下开发PHP扩展的步骤: 首先需要准备的软件有: cygwin 安装路径e:\app\cygwin visual studio C++ 6.0, 修改环境变量,把已经安装好的PHP路径设置为环境变量。在这里,假设我的PHP安装目录是:e:\app\php5.2.5,那么我把WINDOWS环境变量后面加上这个安装目录。方便一会儿使用php.exe。 PHP源代码,这里假设为e:\c_source_code\php-5.2.5 1、修改文件 “PHP源文件目录/ext/ext_skel_win32.php”,在这里就是:E:\c_source_code\php-5.2.5\ext,其中主要是修改其中的cygwin路径。$cygwin_path = ’e:\app\cygwin\bin’; 把$cygwin_path修改为你实际安装cygwin的路径。 2、在源代码ext目录也就是e:\c_source_code\php-5.2.5\ext下,执行 php ext_skel_win32.php –extname=,此时会在ext目录下生成目录,这个目录就是我们将要进行PHP扩展开发的框架。比如你运行php.exe ext_skel_win32.php –extname=foo,会在ext目录下生成foo目录。 3、将php-root\dev\php5ts.lib拷贝至 “ext/”中。比如你要开发的PHP扩展名为foo,那么就需要把php-root\dev\php5ts.lib拷贝到PHP源文件目录\ext\foo中。 4、修改foo.c内容,编写我们需要的C代码。 5、进入目录,打开.dsp。 设置VC6工程, 设置菜单“组建”->“移除工程配置”,选中“Win 32 Release_TS”, 设置菜单“工程”,选中“Win 32 Release_TS” 打开Tab“连接”,设置“输出文件名”中的目录, [可选]打开Tab“C/C++”,增加“预处理器定义”“,COMPILE_DL_”(注意全大写,默认加入的),取消预定义“LIBZEND_EXPORTS”(否则不可引入zend函数)。 6、设置好以后,进行编译,会生成一个dll文件,文件名是.dll,比如在我们的例子中就为foo.dll 把foo.dll拷到e:\app\ext目录下,并在php.ini里加上一行extension=foo.dll,重启一下apache,查看phpinfo();,会发现我们的PHP扩展foo()已经加载进来,已经可以使用这个foo扩展了。 http://info.codepub.com/2008/08/info-21426.html

2009-11-02 · 1 分钟 · admin

(转)整理了一份比较全面的PHP开发编码规范

这些年来多从事Linux下PHP和C相关的开发,带过很多项目和团队,下面是根据经验整理的PHP编码规范,可以用作给大家的范例和参考,根据需要进行取舍和修改! (可能最新的一些php5的规范不够完整,今后有机会保持更新!) 目录 1 编写目的 2 整体要求 3 安全规范 3.1 包含文件 3.1.1 命名规则 3.1.2 存放规则 3.2 安全规则 3.3 一些针对PHP的规则 3.4 其它处理规则 3.4.1 对输入参数值进行转义处理 3.4.2 操作大HTML文本 4 编码规范 4.1 命名规范 4.1.1 变量命名 4.1.2 类 4.1.3 方法或函数 4.1.4 缩写词 4.1.5 数据库表名 4.1.6 数据库字段 4.2 书写规则 4.2.1 代码缩进 4.2.2 大括号{ }书写规则 4.2.3 小括号( )和函数、关键词等 4.2.4 =符号书写 4.2.5 if else swith for while等书写 4.2.6 类的构造函数 4.2.7 语句断行, 每行控制在80个字符以内 4.2.8 不要不可思议的数字 4.2.9 true/false和0/1判断 4.2.10 避免嵌入式赋值 4....

2009-11-01 · 4 分钟 · admin

一个典型的Twisted应用程序框架

一、简介 本文通过继承Twisted中的一些类实现了一个基本的Twisted应用程序,期间实现了协议、工厂并进行了服务器的监听,并将日志输出的屏幕。 二、基本框架 ·导入部分 这部分导入的内容是专供协议和工厂类使用的,其他部分的导入可能并不在同一模块当中,所以到了具体的代码部分再去导入。 from twisted.internet import protocol from twisted.protocols import basic ·协议 继承了一个LineReceiver,实现了行和原始两种方式的数据接收处理,还重载了连接的建立和断开事件。 class ConfigServer(basic.LineReceiver): def __init__(self): pass #by gashero def dataReceived(self,data): pass def lineReceived(self,line): pass def connectionMade(self): pass def connectionLost(self,reason): pass ·工厂 继承了一个服务器工厂, class ConfigServerFactory(protocol.ServerFactory): protocol=ConfigServer def __init__(self): pass def startFactory(self): pass def stopFactory(self): pass def buildProtocol(self,addr): protocol.ServerFactory.buildProtocol(self,addr) pass ·设置日志 from twisted.python import log import sys log.startLogging(sys.stdout) ·启动服务器 from twisted.internet import reactor reactor.listenTCP(8080,ConfigServerFactory(),timeout=10) reactor.run() 三、其他常用方法 ·发送数据,在协议对象的方法中 self.transport.write(data)...

2009-10-27 · 1 分钟 · admin

Setup FreeBSD Jail With ezjail

How do I setup operating system-level virtualization that allows me to partition my FreeBSD-based server system into several independent mini-systems called jails.? I’d like to set one jail for mail and another for web server via 2 public IP address. Each jail under FreeBSD virtual environment runs on the host machine with its own files, processes, user and superuser accounts. From within a jailed process, the environment is almost indistinguishable from a real system....

2009-10-24 · 5 分钟 · admin