【python】同步/异步与阻塞/非阻塞,get/post,__new__/__init__,async/await相关概念

版权声明:尊重原作者,转载请在文章头部注明网址。 https://blog.csdn.net/u013034226/article/details/86545451

同步/异步与阻塞/非阻塞

  1. 同步和异步关注的是消息通信机制.
  2. 同步异步指的是调用者与被调用者两者之间的关系,而不是经常容易误解的多个被调用者之间的关系。
  3. 同步就是当一个进程发起一个函数(任务)调用的时候,一直等到函数(任务)完成,而进程继续处于激活(非阻塞)状态。而异步情况下是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行,当函数返回的时候通过状态、通知、事件等方式通知进程任务完成。
  4. 阻塞与非阻塞针对的是进程或线程:阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程。

参考文献:https://www.jianshu.com/p/47ee57646369


get与post的区别

 

  1. GET在浏览器回退时是无害的,而POST会再次提交请求。
  2. GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  3. GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  4. GET参数通过URL传递,POST放在Request body中。
  5. GET请求在URL中传送的参数是有长度限制的,而POST么有,业界不成文的规定是,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。
  6. GET/POST都是TCP链接
  7. GET产生一个TCP数据包;POST产生两个TCP数据包。长的说:对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

注意:

1、据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
2、并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

链接:https://www.jianshu.com/p/7b9b44e850c8


__new__与__init__的区别

  1. new方法:实例化对象(开辟内存空间)
  2. init方法:对实例化对象进行初始化操作
  3. new方法和init方法会在创建对象时自动被调用,new方法在init方法之前被调用
  4. new方法实例化对象(创建一个内存空间),将实例化的对象return给init,init再对这个实例对象(内存空间)进行初始化属性,如果new方法没有return,init方法不会被调用

总结:
通过一个类创建对象时,会先自动调用new方法,开辟一个内存空间给实例化对象,然后return这个内存空间给init方法,init方法再对这个内存空间进行初始化操作

 


async与await

 

  • 虽然生成器和协程是两个不同的概念,但是由于 Python 通过生成器实现协程,所以很容易认为生成器和协程是相同的;一个函数是否是协程取决于函数体中是否有 yield 或者 yield from,这样会导致重构代码过程中引入不明显的bug。async 能减少重构代码导致的 bug通过引入 async ,我们可以更好的区分生成器和协程,消除了二义性。
  • 异步调用受限于 yield 表达式能出现的地方,即我们只能实现异步函数。通过引入 async ,我们可以定义异步 for 循环和异步上下文管理器。
  • 为了简化并更好地标识异步IO,Python在3.5版本中引入了关于协程的语法糖async和await,可以让coroutine的代码更简洁易读。
  • 请注意,async和await是针对coroutine的新语法,要使用新的语法,只需要做两步简单的替换:
  1. 把@asyncio.coroutine替换为async;
  2. 把yield from替换为await。
  • 完成异步的代码不一定要用async/await,使用了async/await的代码也不一定能做到异步,async/await是协程的语法糖,使协程之间的调用变得更加清晰,使用async修饰的函数调用时会返回一个协程对象,await只能放在async修饰的函数里面使用,await后面必须要跟着一个协程对象或Awaitable,await的目的是等待协程控制流的返回,而实现暂停并挂起函数的操作是yield。
  • 正常的函数在执行时是不会中断的,所以你要写一个能够中断的函数,就需要添加async关键字。
  • async 用来声明一个函数为异步函数,异步函数的特点是能在函数执行过程中挂起,去执行其他异步函数,等到挂起条件(假设挂起条件是sleep(5))消失后,也就是5秒到了再回来执行。
  • await 用来用来声明程序挂起,比如异步程序执行到某一步时需要等待的时间很长,就将此挂起,去执行其他的异步程序。
  • await 后面只能跟异步程序或有__await__属性的对象,因为异步程序与一般程序不同。假设有两个异步函数async a,async b,a中的某一步有await,当程序碰到关键字await b()后,异步程序挂起后去执行另一个异步b程序,就是从函数内部跳出去执行其他函数,当挂起条件消失后,不管b是否执行完,要马上从b程序中跳出来,回到原程序执行原来的操作。如果await后面跟的b函数不是异步函数,那么操作就只能等b执行完再返回,无法在b执行的过程中返回。如果要在b执行完才返回,也就不需要用await关键字了,直接调用b函数就行。所以这就需要await后面跟的是异步函数了。在一个异步函数中,可以不止一次挂起,也就是可以用多个await。

参考文献:

https://www.cnblogs.com/aademeng/articles/7239605.html
https://www.cnblogs.com/wwg945/p/9262357.html
https://www.cnblogs.com/aademeng/articles/7239512.html
https://zhuanlan.zhihu.com/p/27258289

展开阅读全文

没有更多推荐了,返回首页