摘要:譯者說于年月日發(fā)布,該版本正式支持的關(guān)鍵字,并且用舊版本編譯同樣可以使用這兩個(gè)關(guān)鍵字,這無疑是一種進(jìn)步。其次,這是最后一個(gè)支持和的版本了,在后續(xù)的版本了會(huì)移除對(duì)它們的兼容。
譯者說
Tornado 4.3于2015年11月6日發(fā)布,該版本正式支持Python3.5的async/await關(guān)鍵字,并且用舊版本CPython編譯Tornado同樣可以使用這兩個(gè)關(guān)鍵字,這無疑是一種進(jìn)步。其次,這是最后一個(gè)支持Python2.6和Python3.2的版本了,在后續(xù)的版本了會(huì)移除對(duì)它們的兼容。現(xiàn)在網(wǎng)絡(luò)上還沒有Tornado4.3的中文文檔,所以為了讓更多的朋友能接觸并學(xué)習(xí)到它,我開始了這個(gè)翻譯項(xiàng)目,希望感興趣的小伙伴可以一起參與翻譯,項(xiàng)目地址是tornado-zh on Github,翻譯好的文檔在Read the Docs上直接可以看到。歡迎Issues or PR。
示例 - 一個(gè)并發(fā)網(wǎng)絡(luò)爬蟲Tornado的 tornado.queues 模塊實(shí)現(xiàn)了異步生產(chǎn)者/消費(fèi)者模式的協(xié)程, 類似于通過Python 標(biāo)準(zhǔn)庫(kù)的 queue實(shí)現(xiàn)線程模式.
一個(gè)yield Queue.get 的協(xié)程直到隊(duì)列中有值的時(shí)候才會(huì)暫停. 如果隊(duì)列設(shè)置了最大長(zhǎng)度yield Queue.put 的協(xié)程直到隊(duì)列中有空間才會(huì)暫停.
一個(gè)Queue從0開始對(duì)完成的任務(wù)進(jìn)行計(jì)數(shù). Queue.put 加計(jì)數(shù);Queue.task_done減少計(jì)數(shù).
這里的網(wǎng)絡(luò)爬蟲的例子, 隊(duì)列開始的時(shí)候只包含base_url. 當(dāng)一個(gè)worker抓取到一個(gè)頁(yè)面它會(huì)解析鏈接并把它添加到隊(duì)列中, 然后調(diào)用Queue.task_done 減少計(jì)數(shù)一次. 最后, 當(dāng)一個(gè)worker抓取到的頁(yè)面URL都是之前抓取到過的并且隊(duì)列中沒有任務(wù)了.于是worker調(diào)用 Queue.task_done 把計(jì)數(shù)減到0. 等待 Queue.join 的主協(xié)程取消暫停并且完成.
import time from datetime import timedelta try: from HTMLParser import HTMLParser from urlparse import urljoin, urldefrag except ImportError: from html.parser import HTMLParser from urllib.parse import urljoin, urldefrag from tornado import httpclient, gen, ioloop, queues base_url = "http://www.tornadoweb.org/en/stable/" concurrency = 10 @gen.coroutine def get_links_from_url(url): """Download the page at `url` and parse it for links. Returned links have had the fragment after `#` removed, and have been made absolute so, e.g. the URL "gen.html#tornado.gen.coroutine" becomes "http://www.tornadoweb.org/en/stable/gen.html". """ try: response = yield httpclient.AsyncHTTPClient().fetch(url) print("fetched %s" % url) html = response.body if isinstance(response.body, str) else response.body.decode() urls = [urljoin(url, remove_fragment(new_url)) for new_url in get_links(html)] except Exception as e: print("Exception: %s %s" % (e, url)) raise gen.Return([]) raise gen.Return(urls) def remove_fragment(url): pure_url, frag = urldefrag(url) return pure_url def get_links(html): class URLSeeker(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.urls = [] def handle_starttag(self, tag, attrs): href = dict(attrs).get("href") if href and tag == "a": self.urls.append(href) url_seeker = URLSeeker() url_seeker.feed(html) return url_seeker.urls @gen.coroutine def main(): q = queues.Queue() start = time.time() fetching, fetched = set(), set() @gen.coroutine def fetch_url(): current_url = yield q.get() try: if current_url in fetching: return print("fetching %s" % current_url) fetching.add(current_url) urls = yield get_links_from_url(current_url) fetched.add(current_url) for new_url in urls: # Only follow links beneath the base URL if new_url.startswith(base_url): yield q.put(new_url) finally: q.task_done() @gen.coroutine def worker(): while True: yield fetch_url() q.put(base_url) # Start workers, then wait for the work queue to be empty. for _ in range(concurrency): worker() yield q.join(timeout=timedelta(seconds=300)) assert fetching == fetched print("Done in %d seconds, fetched %s URLs." % ( time.time() - start, len(fetched))) if __name__ == "__main__": import logging logging.basicConfig() io_loop = ioloop.IOLoop.current() io_loop.run_sync(main)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/37706.html
摘要:譯者說于年月日發(fā)布,該版本正式支持的關(guān)鍵字,并且用舊版本編譯同樣可以使用這兩個(gè)關(guān)鍵字,這無疑是一種進(jìn)步。其次,這是最后一個(gè)支持和的版本了,在后續(xù)的版本了會(huì)移除對(duì)它們的兼容。 譯者說 Tornado 4.3于2015年11月6日發(fā)布,該版本正式支持Python3.5的async/await關(guān)鍵字,并且用舊版本CPython編譯Tornado同樣可以使用這兩個(gè)關(guān)鍵字,這無疑是一種進(jìn)步。其次...
閱讀 827·2019-08-30 15:54
閱讀 447·2019-08-30 12:51
閱讀 2028·2019-08-29 16:28
閱讀 2850·2019-08-29 16:10
閱讀 2336·2019-08-29 14:21
閱讀 414·2019-08-29 14:09
閱讀 2137·2019-08-23 16:13
閱讀 1242·2019-08-23 13:59