Raymond Hettinger就 Python 中的并发进行了一次演讲,其中一个示例如下所示:
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 来处理呢?