【发布时间】:2018-04-10 16:02:17
【问题描述】:
Raymond Hettinger 在 python 中给出了a talk on concurrency,其中一个示例如下所示:
import urllib.request
sites = [
'https://www.yahoo.com/',
'http://www.cnn.com',
'http://www.python.org',
'http://www.jython.org',
'http://www.pypy.org',
'http://www.perl.org',
'http://www.cisco.com',
'http://www.facebook.com',
'http://www.twitter.com',
'http://www.macrumors.com/',
'http://arstechnica.com/',
'http://www.reuters.com/',
'http://abcnews.go.com/',
'http://www.cnbc.com/',
]
for url in sites:
with urllib.request.urlopen(url) as u:
page = u.read()
print(url, len(page))
基本上我们会跟踪这些链接并打印接收到的字节数,运行大约需要 20 秒。
今天我发现trio 库有相当友好的api。但是,当我尝试将它与这个相当基本的示例一起使用时,我做错了。
第一次尝试(运行大约相同的 20 秒):
import urllib.request
import trio, time
sites = [
'https://www.yahoo.com/',
'http://www.cnn.com',
'http://www.python.org',
'http://www.jython.org',
'http://www.pypy.org',
'http://www.perl.org',
'http://www.cisco.com',
'http://www.facebook.com',
'http://www.twitter.com',
'http://www.macrumors.com/',
'http://arstechnica.com/',
'http://www.reuters.com/',
'http://abcnews.go.com/',
'http://www.cnbc.com/',
]
async def show_len(sites):
t1 = time.time()
for url in sites:
with urllib.request.urlopen(url) as u:
page = u.read()
print(url, len(page))
print("code took to run", time.time() - t1)
if __name__ == "__main__":
trio.run(show_len, sites)
第二个(速度相同):
import urllib.request
import trio, time
sites = [
'https://www.yahoo.com/',
'http://www.cnn.com',
'http://www.python.org',
'http://www.jython.org',
'http://www.pypy.org',
'http://www.perl.org',
'http://www.cisco.com',
'http://www.facebook.com',
'http://www.twitter.com',
'http://www.macrumors.com/',
'http://arstechnica.com/',
'http://www.reuters.com/',
'http://abcnews.go.com/',
'http://www.cnbc.com/',
]
async def link_user(url):
with urllib.request.urlopen(url) as u:
page = u.read()
print(url, len(page))
async def show_len(sites):
t1 = time.time()
for url in sites:
await link_user(url)
print("code took to run", time.time() - t1)
if __name__ == "__main__":
trio.run(show_len, sites)
那么这个例子应该如何使用 trio 来处理呢?
【问题讨论】:
-
你可能想看看aiohttp.readthedocs.io/en/stable我已经使用了一段时间并且取得了巨大的成功。
标签: python asynchronous python-trio