Archive for 算法-编程

昨天下午写了一个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装饰的那个

Continue

看这个模块要先看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方法

Continue

前边ioloop看完了,application以前也看过一点,现在看看application和IOLoop是怎么结合起来的。 Application里的listen(port),实例化一个HTTPServer(),然后listen port address。 HTTPServer()继承自TCPServer, httputil.HTTPServerConnectionDelegate。HTTPServer参数传入application实例,还有一些参数。app保存在属性request_callback中,调用TCPServer的初始化方法,ioloop默认为None。然后都是参数的 保存。 listen方法是TCPServer里的,第一个方法返回socket,后调用add_sockets。self.ioploop为None,调用类静态方法IOLoop.current(),实例化IOLoop。然后将所有socket保存到_sockets中,调用在netutil.py里的add_accept_handler。 add_accept_handler第二个参数是一个函数,_

Continue

看python社区大妈组织的内容里边有一篇讲python内存优化的,用到了__slots__。然后查了一下,总结一下。感觉非常有用 python类在进行实例化的时候,会有一个__dict__属性,里边有可用的实例属性名和值。声明__slots__后,实例就只会含有__slots__里有的属性名。 <pre lang="python"> # coding: utf-8 class A(object): x = 1 def __init__(self): self.y = 2 a = A() print a.__dict__ print(a.x, a.y) a.x = 10 a.y = 10 print(a.x, a.y) class B(object): __slots__ = ('x', 'y') x = 1 z = 2 def __init__(self): self.y = 3 # self.m = 5 # 这

Continue

去官网下载了一个集成开发环境,直接安装。然后报错“Android Studio was unable to find a valid Jvm” google launchctl setenv STUDIO_JDK /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk 解决之。 网上还有种方法是,finder --应用程序--android studio--显示包内容--contents--info.plist,搜索1.6.将1.6*改成1.6+就ok了。 Fetching android sdk component information,这个不知道具体干嘛的,好几次不成功。 同样的目录,contents/bin/idea.properties,最后加一行disable.android.first.run=true。 打开后的配置,configure--project Defaults--Project Structure--Android SDK location 添上 /Users/a0x55aa/Li

Continue

tornado.ioloop.IOLoop.instance().start() ioloop继承自Configurable。 configurable_base返回IOLoop,然后调用configured_class,然后再看IOLoop的configurable_default。这里面根据不同系统选择了不同的IOLoop类实现返回。下一步是initialize初始化了。 看一下epoll吧。 先找了一下IOLoop的start(),意料之中。因为configurable_default返回的类实现都是别的类,要看具体别的类中的定义了。 epoll.py里的EPollIOLoop只定义了initialize,EPollIOLoop继承自PollIOLoop,在ioloop.py文件里。 PollIOLoop继承自IOLoop,现在还不知道为什么这么继承,先往下看。super,IOLoop里边是空的。下边用到initialize第二个参数是impl。在PollIOLoop里是select.epoll()。还要去看看platform/select.py,额 我去还是

Continue

想看一下IOLoop类的实现,发现继承自Configurable。就先看一下这个类。 Configurable类在util.py这个文件里。Configurable类的子类有AsyncHTTPClient,Resolver,IOLoop。 看__new__构造方法,configurable_base返回一个子类的实现,如果返回类本身。类的实现需要调用configured_class,主要初始化了__impl_class在configurable_default里。然后通过子类中configurable_default的定义选择不同的__impl_class(类实现)返回。initialize初始化类。 然后没了 ,没想到这么短。等后边看看IOLoop。

Continue

记录,说不定以后还能用到。打jar包指定main程序入口 <pre lang="java">public class Hello{ public static void main(String[] args){ System.out.println("hello"); } }</pre> java版helloworld。保存成Hello.java。执行 javac Hello.java会生成Hello.class jar cvf hello.jar Hello.class生成hello.jar 现在直接执行java -jar hello.jar会提示“hello.jar中没有主清单属性”要先指定程序入口 解压hello.jar,会看到/META-INF/MANIFEST.MF文件 Manifest-Version: 1.0 Created-By: 1.8.0_25 (Oracle Corporation) 加上两行 Class-Path: . Main-Class: Hello 执行 jar umfv M

Continue

github地址 https://github.com/0x55aa/pytoto 写不下去了,又开始写别的了 我去。 总是做着做着发现东西越来越多。

Continue

在django/conf/__init__.py里,最后一行,settings = LazySettings()。到LazySettings(),继承自LazyObject,django/utils/functional.py里,初始化的时候self._wrapped为object()。LazyObject也设置了__getattr__,不过差不多。回头看LazySettings的__getattr__,开始要执行_setup,然后使用getattr取值。 ---- def _setup(self, name=None): settings_module = os.environ[ENVIRONMENT_VARIABLE],这个在wsgi脚本,或者在manage.py里有设置,就是项目的setting,例如mysite.settings。然后self._wrapped = Settings(settings_module)。Settings应该是设置值的。 ---- Settings集成自BaseSettings,BaseSettings里只有一个__setattr__方法。

Continue