当前位置: 代码迷 >> 综合 >> 公众号的一些高质量文章
  详细解决方案

公众号的一些高质量文章

热度:55   发布时间:2023-09-05 19:22:56.0
  • 类是创建对象的模板
  • 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,使得所有该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()查看
  相关解决方案