Jestem w trakcie przenoszenia jakiegoś kodu synchronicznego do asyncio przy użyciu aiohttp. synchroniczny kod trwał 15 minut, więc mam nadzieję, że poprawi to.Python aiohttp/asyncio - jak przetwarzać zwrócone dane
Mam działający kod, który pobiera dane z niektórych adresów URL i zwraca treść każdego z nich. Ale jest to tylko przeciwko 1 stronie laboratorium, mam ponad 70 rzeczywistych stron.
Więc jeśli dostałem pętlę, aby utworzyć listę wszystkich adresów URL dla wszystkich witryn, które utworzyłyby 700 adresów URL na liście do przetworzenia. Czy przetwarzanie ich nie wydaje mi się problemem?
Ale robiąc "rzeczy" z wynikami, nie jestem pewien jak programować? Mam już kod, który zrobi "stuff" do każdego zwróconego wyniku, ale nie jestem pewien, jak zaprogramować odpowiedni wynik.
Po uruchomieniu kodu przetwarza wszystkie adresy URL i w zależności od czasu do uruchomienia zwraca nieznane zamówienie?
Czy potrzebuję funkcji, która przetworzy każdy rodzaj wyniku?
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()
Dzięki, rozumiem wszystko, co powiedziałeś, ale straciłeś mnie w części ProcessPoolExecutor. Muszę mieć oddzielny procesor CPU wyniki? jak mam to zrobic? i jak mogę je przetworzyć w kolejności lub czy potrzebuję funkcji, która przetwarza wszystkie wyniki bez względu na rodzaj? – AlexW