Async can be a bit tricky, for sure, but your conclusion is incorrect. Here's a version that is 4x faster than your pool version:
import asyncio
import aiohttp
from datetime import datetime
import json
class AsynChuck:
def __init__(self, number_of_jokes: int):
self.base_api_url = "http://api.icndb.com/jokes/random"
self.number_of_jokes = number_of_jokes
@staticmethod
def convert_to_json(response):
jsonified = json.loads(response)
return jsonified
async def fetch(self, session:object):
async with session.get(self.base_api_url) as response:
return await response.json()
async def get_em(self):
async with aiohttp.ClientSession() as session:
return await asyncio.gather(*[
self.fetch(session)
for _ in range(0, self.number_of_jokes)
])
def main():
t1 = datetime.now()
MrNorris = AsynChuck(number_of_jokes=200)
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(MrNorris.get_em())
responses = loop.run_until_complete(future)
for joke in responses:
if joke["type"] == "success":
print(joke)
t2 = datetime.now()
timer = t2 - t1
print(f'Process took {timer} seconds')
if __name__ == '__main__':
main()
It does 10,000 jokes in 22s, while poolChuck takes 0:07:03.188157.