公众号的一些高质量文章

  • 时间:
  • 来源:互联网
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44291044/article/details/103304331
  • 类是创建对象的模板
  • 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 threading

def job1():
    global n, lock

    lock.acquire()
    for i in range(10):

        n += 1
        print("job", n)
    lock.release()

def job2():
    global n, lock
    lock.acquire()
    for i in range(10):
        n += 10
        print("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 threading

event = threading.Event()

# 重置event,使得所有该event事件都处在待命状态
event.clear()

# 等待接收event指令,决定是否阻塞程序执行
event.wait()

# 发送event指令,使所有设置该event事件的线程执行
event.set()
cond = threading.Condition()

# 类似lock.acquire()
cond.acquire()

# 类似lock.release()
cond.release()

# 等待指定触发3,同时会释放对锁的获取,直到被notify才重新占有锁
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()查看

本文链接http://element-ui.cn/news/show-411.aspx