异步代码的魔术装饰语法。
tomorrow的Python项目详细描述
python中异步代码的magic decorator语法
安装
明天可以通过pip方便地获得:
pip install tomorrow
或通过git clone和setup.py安装
git clone git@github.com:madisonmay/Tomorrow.git sudo python setup.py install
用法
明日图书馆使您能够利用 多线程,很少考虑实现细节。
在幕后,库是围绕^{tt3}的薄包装$ 在concurrent.futures中解析Future的对象 您尝试访问它的任何属性。
足够多的实现细节,让我们看看它有多简单 就是用最少的 努力。
天真的刮网器
您已经收集了一个url列表,并希望下载 很多。以下是一个非常合理的解决方案 任务。
对于下面的例子,我们将使用来自alexa的顶级站点 排名。
urls=['http://google.com','http://facebook.com','http://youtube.com','http://baidu.com','http://yahoo.com',]
那么,让我们开始代码。
importtimeimportrequestsdefdownload(url):returnrequests.get(url)if__name__=="__main__":start=time.time()responses=[download(url)forurlinurls]html=[response.textforresponseinresponses]end=time.time()print"Time: %f seconds"%(end-start)
更高效的刮网器
使用明天的decorator语法,我们可以定义一个函数 在多个线程中执行。对download的单独调用是 无阻塞,但我们可以忽略这个事实并编写代码 与我们在同步范式中的情况完全相同。
importtimeimportrequestsfromtomorrowimportthreads@threads(5)defdownload(url):returnrequests.get(url)if__name__=="__main__":importtimestart=time.time()responses=[download(url)forurlinurls]html=[response.textforresponseinresponses]end=time.time()print"Time: %f seconds"%(end-start)
太棒了!只有一行额外的代码(没有显式的 线程逻辑)我们现在可以高效地下载约10倍的网站。
您还可以选择传入一个超时参数,以防止挂起 在不能保证返回的任务上。
importtimefromtomorrowimportthreads@threads(1,timeout=0.1)defraises_timeout_error():time.sleep(1)if__name__=="__main__":printraises_timeout_error()
它是如何工作的?
请随意阅读源代码,以便在幕后窥探一番,这是不太重要的 那50行代码。