tornado Future相关理解

昨天下午写了一个postgresql访问接口库psycopg2的异步封装,这个库是支持异步请求postgresql的,所以只是简单的封装了一下。简介了torndb和一个网上写好的异步库momoko,又找到一个网上分享的ppt。写的时候直接用gen.coroutine装饰接口函数,这样我再models里写的时候直接yield query()就行了。 写完对tornado异步封装的代码也看了一些,有了一些理解,不过没有循序看。之前看到时候感觉太乱实在不想从新看了。先记录一下,可能很多错误。 future是保存的异步的结果,这个类是在concurrent.py文件里。 result()方法是返回结果,通过done()方法判断执行结束,就可以用result方法获得结果。 set_result()是设置结果,像gen.Task()就是调用一个带有callback参数的异步方法,返回future,变成为一个可以使用yield协程 的函数,对他就是个函数。2333 这个函数里边就使用了set_result()方法,Task这个函数其实不复杂写了那么多的目的就是把Task装饰的那个函数里边callback的参数用set_result()设置成返回值,保存在future里。哈哈 我觉得以后我看这里也不会看懂,还不如直接看代码容易。这里用到了带名字的元组,这个看到过没用过。set_result()用的地方很多 其他的基本就是异常处理, 先看看其他周边,想gen.Return是继承自Exception所以这个用raise,这个异常会在后边用的时候捕获到,然后当做结果。 其他的没看,代码没看全,没看到那些类和函数。 coroutine这个装饰器,内容很多。 先是执行函数,有返回值,保存,然后如果抛出Return exception 获取里边的值,或者其他程序异常。 没有异常,就判断结果是否是生成器,不是生成器直接将结果set_result保存到future并返回结果,如果是next执行之,如果执行完或者Return设置执行完的值,这里异常处理和上边一样,执行完后如果没有异常产生,执行Runner(),handler_yield没看,主要看了run(),处理方式基本相同,主要就是将刚刚执行的结果通过send方法返回给yield前边的变量,就是类似a = yield query()这种,将结果返回给a。 然后总结一下思路,可能不太对。requesthandler执行的时候,执行相对应的http method,如果返回的不是future,那ok,流程上边写过了,执行完没有异常并判断不是个生成器类型就会直接在future保存结果并返回。为什么还要保存到future中呢。因为requesthandler里的execute也是经过coroutine修饰过了。 发现返回一个future,因为比如一个get方法被我们用coroutine装饰了。然后他就yield,这个的返回结果就是你get方法的结果了。 然后执行对应的我的model里的search_result(),然后执行query语句,我都是用gen.Return返回的结果,怎么感觉这么复杂。。。感觉这样写不太对,不太符合设计 query方法先获取cursor,这些都是coroutine修饰的,都是返回的生成器类型。(之所以这样写,这个库只我自己用,我不喜欢callback的模式,感觉yield写起来也方便看起来也方便,封装的时候参数也不写callback了)使用gen.Task获取conn,为啥用这个因为这个必须设置callback,然后里边的callback参数就是conn,这样task会将装饰的函数参数callback的参数最终作为结果返回。这里说装饰也不太对,Task不是个装饰器。感觉跟functools里的partial很像,但不一样,他返回一个future。这样就会最终返回给我链接数据库的conn,在cursor我是用gen.Return返回corsors,这个会捕获到Return异常直接设置到future里当做结果,最后通过runner里的run返回给yield关键字前的cursor变量。这样就获取到了cousor。。。。。下边执行语句的时候和这个流程一样
Read more...

postgresql插件pg_stat_statements查看慢sql

从网上找到这个插件可以查看postgresql数据库执行的慢sql。于是安装试试,but   先写出文档来http://www.postgresql.org/docs/current/static/pgstatstatements.html 配置文件需要做的更改 # postgresql.conf shared_preload_libraries = 'pg_stat_statements' pg_stat_statements.max = 10000 pg_stat_statements.track = all 重启postgresql后,发现报错了“could not access file "pg_stat_statements": No such file or directory”。从网上也没找到问题,群里问也没说的。然后慢慢查postgresql插件的资料,发现我freebsd机器插件目录里没有这个插件。/usr/local/share/postgresql/extension 然后我看了pkg的包资料,发现应该是少装了一个包, pkg info | grep postgresql 安装之,修改配置文件,重启。这次正确重启了。然后 create extension pg_stat_statements; \dx查看 多了一个pg_stat_statements.成功了。我的程序一直在跑,然后直接就查这个表就能看到数据。给力的功能。 这个是官方给的sql查询的,我觉得看单次最大时间,和单条平均时间还是有用的。哈哈,这个看了还要再算一下。 清空数据:SELECT pg_stat_statements_reset();
Read more...

postgresql常用命令总结1

//\加上字母l,相当于mysql的,mysql> show databases;
\l
//以KB,MB,GB的方式来查看数据库大小
select pg_size_pretty(pg_database_size('playboy'));
//相当于mysql的,mysql> show tables;
\dt
//以KB,MB,GB的方式来查看表大小
select pg_size_pretty(pg_relation_size('test'));
//查看表的总大小,包括索引大小
select pg_size_pretty(pg_total_relation_size('test'));
//查看索大小
select pg_size_pretty(pg_relation_size('playboy_id_pk'));
哈哈 这里我查了一下表数据80M,一个全文检索索引230M。
//查看所有表空间 select spcname from pg_tablespace;
//查看表空间大小
select pg_size_pretty(pg_tablespace_size('pg_default'));
Read more...

Postgresql获取插入的自增id

declare id_r integer; SELECT currval('haha_id_seq') INTO id_r; 我是写了一个类似mysql 中 ON DUPLICATE KEY UPDATE的功能function,所以选则了这种方法。有重复记录就返回0,没重复记录就返回插入的id。 其实在数据库中执行\d 可以看到有自增id会出来一个表xx_id_seq,表里就一条数据,记录了id的相关数据。
Read more...

freebsd pkg freebsd size mismatch, cannot continue

今天freebsd上装nasm的时候,爆了这个奇怪的错误,开始以为不是本地的原因就源码安装,成功安装了。
晚上安装别的又出现这个错误了,于是找了一下解决方法。

sudo pkg update -f
Read more...

使用umeditor上传图片一直提示上传失败

网站的编辑器从simditor换到了emeditor。原因是嫌simditor的编辑功能太弱。比如样式都在前台定义的,不能控制单个字符的大小,源代码编辑刚加上,效果也不尽人意。 但是换成emeditor,开始挺快,配置也简单,但是上传图片这一关,搞了好长时间,不知道错在哪里。返回的数据按照官网来的,蛋就是提示上传失败。然后没办法Google了一下,发现也有人有这个问题。最后找的了别人的解决方法,貌似是官方的bug,不知道为什么一直不修复。 修改image.js里的186行左右,添加一行
r=r.replace("<pre>", "").replace("</pre>", ""); var json = eval('('+r+')');
Read more...

博客经常被刷流量,不知道什么原因

完全不知道刷的什么,以前还有刷feed的,我确定不是爬虫阅读器之类,爬虫阅读器基本会在头部进行标注,ip全世界分散。完全不知道什么目的。 之前还想破解后台密码,,第一都不知道用户名,第二密码也不好破吧。反正我又加了个验证码,而且验证码不给地址。 破解了密码能怎么样,,我这是个人博客,信息完全公开也没有隐身可以看。。
Read more...

mac下使用adb tcpdump抓取安卓手机数据包

说说为啥发现这么个蛋疼方法。昨晚上想测试一个手机app的安全问题,想进行网络抓包。然后mac没法插网线不能开WiFi共享,无法通过在mac上抓包实现了。然后用freebsd虚拟机想试试混杂模式看能不能获取到,搞了半天没成功,今天也没再试。mac好像还不支持混杂模式。然后搜索发现网上有一种代理的方法,看看头就大了。又发现一种使用安卓sdk里的工具进行抓包的方法,试用了一下。 安卓手机usb连接电脑,这个在android studio里会显示,直接插入,在mac下以前都没反应。 adb工具目录在 ~/Library/Android/sdk/platform-tools/adb 。 然后使用./adb devices 可以查看当前连接的手机设备 然后 ./adb push /Users/a0x55aa/Downloads/tcpdump /data/local/tcpdump 1673 KB/s (645840 bytes in 0.376s) copy到手机上 ./adb shell 连接到手机的shell上,可以先ls一下刚刚拷贝的tcpdump是否在,然后附上执行权限 chmod 777 /data/local/tcpdump 然后tcpdump -i any -p -s 0 -w /sdcard/capture0.pcap抓包,操作手机,完毕后停止 对 整个操作要root权限,我手机已root,adb shell的时候就已经是root用户了。。 最后 在你电脑的shell上执行./adb pull /sdcard/capture0.pcap ~/ 3333 KB/s (165496 bytes in 0.048s) 将抓取的包文件 下载下来 用Wireshark分析就行了。 安卓开发还没研究,应用的信息有一个重要目录 /data/data/app_name/ 记录一下。
Read more...

freebsd安装postgresql

折腾了好长时间,重新初始化好多次。 安装的时候,命令:pkg search postgresql.额 好多包,选择最新的9.4安装server,会一起安装client。安装完会有很多文字提示,这个很有用。安装完会新建一个用户pgsql,家目录为/usr/local/pgsql. 第一步, 要先切换到pgsql用户下,su root, su pgsql。然后在pgsql home目录创建data文件夹。root用户下好像是不允许的 初始化,initdb -D /usr/local/pgsql/data/ ,会生成很多文件。初始化数据库存储区,会自动创建一个 postgres的数据库,放乱七八糟的设置和第三方插件的数据。还会有一个模板 template1。这里还不是很清楚,以后创建数据库就会用这个模板创建。这里要说的是数据库编码的问题,这里悲剧的初始化了好多次。 默认执行上边的命令后,提示文字会跟你说(当时没看。。)默认数据库编码为“sql_ascii”,默认文本搜索设置为 english。。我靠执行的时候就瞅着屏幕发呆了,就等执行完。。。重新初始化的方法,我也是从提示中看到的,直接initdb会提示你 要清空原来文件夹或者新建。直接rm -rf *.initdb --help 可以看到字符编码的设定用--encoding ,initdb --encoding=UTF8 -D /usr/local/pgsql/data/ 启动postgresql,启动脚本/usr/local/etc/rc.d/postgresql。开始要添加到/etc/rc.conf文件,这个也是有提示的。 status not running,start成功 创建数据库,createdb --encoding=UTF-8 bt,使用客户端连接,qsql bt, 进去后 show server_encoding;查看server编码,utf8 \encoding 查看客户端编码。客户端还是SQL_ASCII,可以使用/encoding utf8改变客户端编码。 也可以直接使用\l查看。 ok了 基本没别的问题了。
Read more...

python contextlib

看这个模块要先看with as的用法,最常用的方法就是打开一个文件: with open("filename") as f: f.read() with可以调用一个上下文管理器,产生运行时的上下文环境。上下文管理器主要定义两个方法,__enter__,__exit__。__enter__返回上下文里操作的对象,如f。__exit__是销毁对象和异常处理。 contextlib模块对外有三个接口, contextmanager装饰器,装饰的函数必须是一个生成器。然后返回一个函数,在函数调用的时候返回一个上下文管理器。 nested为了一次调用多个上下文管理器的时候用,将所有上下文管理器里的__enter__放到vars里,一次yield返回,然后unpack。就产生多个对象了。__exit__都放到exits列表里,在finally里统一调用,这些__exit__在调用上下文管理器产生异常时,如何处理。如果返回false,将会把异常继续抛出,返回true则不会抛出异常。 closing,这个用过,没想到的是竟然是个类,而不是个函数。就是把有close方法却没有__exit__方法的对象变成一个上下文管理器。代码很简单:
class closing(object):
    def __init__(self, thing):
        self.thing = thing
    def __enter__(self):
        return self.thing
    def __exit__(self, *exc_info):
        self.thing.close()
Read more...

Previous Page 1 2 3 4 5 6 7 8 9 10 Next Page 最后一页