- 类是创建对象的模板
- type是python背后创建所有类的元类
- object也是type创建的
- type(type、object、int、str)返回值也都是type
- 元类:拦截类的创建、拦截下后进行修改、修改完后返回修改后的类
- 使用元类是要对类进行定制化修改,最典型的就是Django ORM的例子
- 元类的new和普通的不一样,元类的new可以获取上层类的一切属性和方法,包括类名、魔法方法
- 普通类的new只能获取到实例化时外界传入的属性
- 服务端:创建socket对象–bind–listen–accept–数据传输层
- 客户端:创建socket对象–connect–数据传输层
- environ:WSGI的环境信息
- start_response:相应请求函数
- Django是专业的应用程序框架,并不擅长与服务端
- lock = threading.Lock() 生成锁
- lock.acquire() 获取锁
- lock.release() 释放锁
- 上下文管理器自动管理,执行结束后自动释放锁
import threadingdef job1():global n, locklock.acquire()for i in range(10):n += 1print("job", n)lock.release()def job2():global n, locklock.acquire()for i in range(10):n += 10print("job2", n)lock.release()n = 0
lock = threading.Lock()t1 = threading.Thread(target=job1)
t2 = threading.Thread(target=job2)
t1.start()
t2.start()
- RLock:可重入锁,允许在同一个线程重复对所的获取
- 死锁的原因:同以线程套取同一把锁造成死锁:可以用RLock来解决
线程间通信
- threading.Event
- threading.Condition
- queue.Queue
- threading.Event:多个线程可以等待某个事件的发生事件发生后,所有的线程都被激活
import threadingevent = threading.Event()
event.clear()
event.wait()
event.set()
cond = threading.Condition()
cond.acquire()
cond.release()
cond.wait()
cond.notify()
- Queue是最好的线程通信的方式
- Thread可以当做参数传入类中,就可以通过实例化的对象start创建线程
- 如果想在当前线程保存一个全局值,并且各自线程互不干扰,使用local类吧
yield用法
- yield from 后面可以加一个可迭代对象,可以将里面的元素一个一个yield出来
asyncio
- future对象:将要执行和没有执行的任务结果
- task:对协程进一步的封装,是future的子类
- await和yield用于挂起阻塞的异步调用接口
- 协程的完整工作流程:创建async函数,创建协程对象、将协程转换成task任务、定义事件循环对象容器、将task任务放入容器里触发
- future对象的创建:asyncio.ensure_future(协程对象),因为task是future的子类
- await后面只能接future对象/协程对象
- 还可以添加回调函数
- 将协程注册到事件循环asyncio.wait() 或asyncio.gather()
- return的结果可用task.results()查看