Trong câu hỏi trước đó, một trong những tác giả của aiohttp
cách vui lòng đề nghị fetch multiple urls with aiohttp sử dụng async with
cú pháp mới từ Python 3.5
:web asyncio cào 101: lấy nhiều url với aiohttp
import aiohttp
import asyncio
async def fetch(session, url):
with aiohttp.Timeout(10):
async with session.get(url) as response:
return await response.text()
async def fetch_all(session, urls, loop):
results = await asyncio.wait([loop.create_task(fetch(session, url))
for url in urls])
return results
if __name__ == '__main__':
loop = asyncio.get_event_loop()
# breaks because of the first url
urls = ['http://SDFKHSKHGKLHSKLJHGSDFKSJH.com',
'http://google.com',
'http://twitter.com']
with aiohttp.ClientSession(loop=loop) as session:
the_results = loop.run_until_complete(
fetch_all(session, urls, loop))
# do something with the the_results
Tuy nhiên khi một trong những yêu cầu phá vỡ session.get(url)
(như trên vì http://SDFKHSKHGKLHSKLJHGSDFKSJH.com
) lỗi không được xử lý và toàn bộ sự cố.
tôi tìm cách để chèn kiểm tra về kết quả của session.get(url)
, ví dụ tìm kiếm địa điểm cho một try ... except ...
, hoặc cho một if response.status != 200:
nhưng tôi chỉ không hiểu làm thế nào để làm việc với async with
, await
và các đối tượng khác nhau.
Vì async with
vẫn còn rất mới, không có nhiều ví dụ. Nó sẽ rất hữu ích cho nhiều người nếu một thuật sĩ asyncio
có thể hiển thị như thế nào để làm điều này. Sau tất cả những điều đầu tiên, hầu hết mọi người sẽ muốn thử nghiệm với asyncio
sẽ nhận được nhiều tài nguyên đồng thời.
Goal
Mục đích là chúng ta có thể kiểm tra the_results
và nhanh chóng xem một trong hai:
- url này thất bại (và tại sao: mã trạng thái, có lẽ tên ngoại lệ), hoặc
- này url đã hoạt động và đây là đối tượng phản hồi hữu ích
Tuyệt vời, cảm ơn bạn rất nhiều! Tôi sẽ cần phải tiêu hóa điều này, nhưng sau khi chơi với nó một chút nó có vẻ khá linh hoạt. +1, chấp nhận. :) –
Câu trả lời hay. Một điều tôi tò mò, vì bạn ngay lập tức lặp lại kết quả sau khi thực hiện 'asyncio.gather' sẽ không tốt hơn nếu bạn làm 'asyncio.as_completed' trong danh sách' fetch'es? Bằng cách này, bạn có thể lặp lại những người đã hoàn thành ngay lập tức so với chờ đợi cho họ tất cả để kết thúc? – dalanmiller
@dalanmiller: nó yêu cầu xử lý ngoại lệ, như trong câu trả lời của Padraic Cunningham. Nhưng nếu bạn cần kết quả cho mỗi tương lai ngay lập tức thì đây là con đường. – kwarunek