aiohttpを使用して、同期コードをasyncioに移動するプロセスにあります。同期コードは実行するのに15分かかりましたので、私はこれを改善したいと考えています。Python aiohttp/asyncio - 返されたデータを処理する方法
いくつかのURLからデータを取得し、それぞれの本体を返す作業コードがあります。しかし、これはちょうど1つの研究室サイトに対してです、私は70以上の実際のサイトを持っています。
したがって、リスト内の700個のURLを処理するすべてのサイトのすべてのURLのリストを作成するためのループがあるとします。今それらを処理すると、私は問題ではないと思いますか?
しかし、結果と「もの」をして、私はどのようにプログラムするのか分からないのですか?返される結果のそれぞれに「もの」を加えるコードはすでにありますが、結果の正しいタイプに対してプログラミングする方法がわかりません。
コードを実行すると、すべてのURLが処理され、実行する時間によっては不明な順序が返されますか?
結果を処理する関数が必要ですか?
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()
ありがとう、私はあなたが言ったことのすべてを理解していますが、あなたはProcessPoolExecutorの部分で私を失ってしまいました。私は結果を別のCPUプロセスを持つ必要がありますか?どうすればいいですか?どのようにそれらを順番に処理するのですか、またはどのタイプに関係なくすべての結果を処理する関数が必要ですか? – AlexW