目录
-
概念上下文:
-
同步的方式:
-
异步加回调的方式:
-
异步协程方式:
-
总结:
这里分享一个 协程原理到实现,全局分析丨协程的切换与调度视频点击查看:「链接」
正文
本文主要介绍在网络请求中的同步与异步,以及异步的表现形式: 回调与协程,并通过python代码展示各自的优缺点。
概念上下文:
回到顶部
当提到同步与异步,大家不免会想到另一组词语:阻塞与非阻塞。通常,同时提到这个这几个词语一般实在讨论network io的时候,在《unix network programming》中有详尽的解释,网络中也有许多讲解生动的文章。
本文所讨论的同步与异步,是指对于请求的发起者,是否需要等到请求的结果(同步),还是说请求完毕的时候以某种方式通知请求发起者(异步)。在这个语义环境下,阻塞与非阻塞,是指请求的受理者在处理某个请求的状态,如果在处理这个请求的时候不能做其它事情(请求处理时间不确定),那么称之为阻塞,否则为非阻塞。
举个例子,我去柜台办理业务,那我是请求者,柜员时受理者。如果我在柜台一直等着柜员办理,直到办理完毕,那么对于我来说,就是同步的;如果我只是在柜员那里登记,然后到一边歇着,等柜员办理完毕之后告诉我结果,那么就是异步的。对于柜员,办理业务的时候可能需要等待打印机打印,如果在这个时候柜员去处理其他人的业务,那么就是非阻塞的,如果一定得到把我的业务办完再接待下一位顾客,那么就是阻塞的。
本文站在请求发起者的角度来思考同步与异步,在实际开发中,一个最简单的例子就是http请求。假设这么一个场景,程序需要访问两个网址(通过url),如果只有一个线程。那么同步与异步分别怎么处理呢
同步的方式:
回到顶部
python的urllib2提供了http请求的功能,我们来看看代码:
1 def http_blockway(url1, url2):
2 import urllib2 as urllib
3 import time
4 begin = time.time()
5 data1 = urllib.urlopen(url1).read()
6 data2 = urllib.urlopen(url2).read()
7 print len(data1), len(data2)
8 print 'http_blockway cost', time.time() - begin
9
10 url_list = [ 'ht