Im trong quá trình di chuyển một số mã đồng bộ sang asyncio bằng aiohttp. mã đồng bộ mất 15 phút để chạy, vì vậy tôi hy vọng sẽ cải thiện điều này.Python aiohttp/asyncio - cách xử lý dữ liệu trả về
Tôi có một số mã làm việc lấy dữ liệu từ một số url và trả về phần thân của mỗi url. Nhưng điều này chỉ chống lại 1 trang web trong phòng thí nghiệm, tôi có hơn 70 trang web thực tế.
Vì vậy, nếu tôi có vòng lặp để tạo danh sách tất cả các url cho tất cả các trang web sẽ tạo 700 url trong danh sách cần xử lý. Bây giờ chế biến chúng tôi không nghĩ là một vấn đề?
Nhưng làm 'công cụ' với kết quả, tôi không chắc chắn cách lập trình? Tôi có mã đã được rằng sẽ làm 'công cụ' cho mỗi kết quả được trả lại, nhưng tôi không chắc chắn làm thế nào để chương trình chống lại loại kết quả phù hợp.
Khi mã chạy nó xử lý tất cả các url và tùy thuộc vào thời gian chạy, trả lại một thứ tự không xác định?
Tôi có cần chức năng xử lý bất kỳ loại kết quả nào không?
import asyncio, aiohttp, ssl
from bs4 import BeautifulSoup
def page_content(page):
return BeautifulSoup(page, 'html.parser')
async def fetch(session, url):
with aiohttp.Timeout(15, loop=session.loop):
async with session.get(url) as response:
return page_content(await response.text())
async def get_url_data(urls, username, password):
tasks = []
# Fetch all responses within one Client session,
# keep connection alive for all requests.
async with aiohttp.ClientSession(auth=aiohttp.BasicAuth(username, password)) as session:
for i in urls:
task = asyncio.ensure_future(fetch(session, i))
tasks.append(task)
responses = await asyncio.gather(*tasks)
# you now have all response bodies in this variable
for i in responses:
print(i.title.text)
return responses
def main():
username = 'monitoring'
password = '*********'
ip = '10.10.10.2'
urls = [
'http://{0}:8444/level/15/exec/-/ping/{1}/timeout/1/source/vlan/5/CR'.format(ip,'10.10.0.1'),
'http://{0}:8444/level/15/exec/-/traceroute/{1}/source/vlan/5/probe/2/timeout/1/ttl/0/10/CR'.format(ip,'10.10.0.1'),
'http://{0}:8444/level/15/exec/-/traceroute/{1}/source/vlan/5/probe/2/timeout/1/ttl/0/10/CR'.format(ip,'frontend.domain.com'),
'http://{0}:8444/level/15/exec/-/traceroute/{1}/source/vlan/5/probe/2/timeout/1/ttl/0/10/CR'.format(ip,'planner.domain.com'),
'http://{0}:8444/level/15/exec/-/traceroute/{1}/source/vlan/5/probe/2/timeout/1/ttl/0/10/CR'.format(ip,'10.10.10.1'),
'http://{0}:8444/level/15/exec/-/traceroute/{1}/source/vlan/5/probe/2/timeout/1/ttl/0/10/CR'.format(ip,'10.11.11.1'),
'http://{0}:8444/level/15/exec/-/ping/{1}/timeout/1/source/vlan/5/CR'.format(ip,'10.12.12.60'),
'http://{0}:8444/level/15/exec/-/traceroute/{1}/source/vlan/5/probe/2/timeout/1/ttl/0/10/CR'.format(ip,'10.12.12.60'),
'http://{0}:8444/level/15/exec/-/ping/{1}/timeout/1/source/vlan/5/CR'.format(ip,'lon-dc-01.domain.com'),
'http://{0}:8444/level/15/exec/-/traceroute/{1}/source/vlan/5/probe/2/timeout/1/ttl/0/10/CR'.format(ip,'lon-dc-01.domain.com'),
]
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(get_url_data(urls,username,password))
data = loop.run_until_complete(future)
print(data)
if __name__ == "__main__":
main()
Cảm ơn, tôi hiểu tất cả những gì bạn đã nói nhưng bạn đã mất tôi ở phần ProcessPoolExecutor. Tôi cần phải có một quá trình CPU riêng biệt kết quả? Làm thế nào để tôi làm điều này? và làm thế nào để xử lý chúng theo thứ tự, hoặc tôi cần một chức năng xử lý tất cả các kết quả không có vấn đề gì loại? – AlexW