рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди:
рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдЕрдЬрдЧрд░ рдЕрд╕рд┐рдирд╕рд┐рдпреЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдПрдХ рд░реЗрдХ рдкрд░ рдХрджрдо рд░рдЦрддреЗ рд╣реБрдП, рдореИрдВ рдбреНрд░рд╛рдИ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рд╕реБрдЦрдж рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЧрдпрд╛ред рдореБрдЭреЗ рдпреЗрд░ рдбрд╛рдпрдЬрд╝ "рдЕрд╕рд┐рдирд╕рд┐рдпреЛ рдХреЛрд░рд╛рдЙрдЯрд╛рдЗрди рдкреИрдЯрд░реНрди: рдмрд┐рдпреЙрдиреНрдб рд╡реЗрдЯ" рдХрд╛ рдПрдХ рд▓реЗрдЦ рдЖрдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд▓реЗрдЦрдХ рдиреЗ рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рддрд░реАрдХреЗ рд╕реЗ рдПрд╕рд┐рдирд╕рд┐рдпреЛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдВрдЪ рдХреА рдФрд░ рдХреБрдЫ рдЯреНрд░рд┐рдХреНрд╕ рд╢реЗрдпрд░ рдХрд┐рдПред рдЪреВрдВрдХрд┐ рдореБрдЭреЗ рд░реВрд╕реА рдореЗрдВ рдХреБрдЫ рднреА рдкреВрд░рд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
Asyncio рдПрдХ рдЕрдЬрдЧрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╕рдкрдирд╛ рд╣реИ: рдЖрдк рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкрд░ рдХреЛрдбрд┐рдВрдЧ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдкрд╛рдпрдерди рдХреЛ рдЖрд░рд╛рдо рдХрд░рдиреЗ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдПрдВрдЯреА-рдЧреНрд░реЗрд╡рд┐рдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдПрдХ рдФрд░ рдЖрдпрд╛рдд рд╣реИ: рдПрдВрдЯреА-рдЧреНрд░реЗрд╡рд┐рдЯреА рдХрд╛ рдЖрдпрд╛рдд
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдРрд╕рд╛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ, рд╕рдорд╡рд░реНрддреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдПрдХ рдХрдард┐рди рдХрд╛рдо рд╣реИ рдФрд░, рдЬрдмрдХрд┐ рдХреЛрд░рдЯрд╛рдЗрди рд╣рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдирд░рдХ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдХрд╛рдлреА рджреВрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЕрднреА рднреА рдХрд╛рд░реНрдп рдмрдирд╛рдиреЗ, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рджреБрдЦрдж рд╣реИред
рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм asyncio рдореЗрдВ рд╕рдВрднрд╡ рд╣реИред рдмреБрд░реА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдиреАрдЪреЗ рдХреБрдЫ рдкреИрдЯрд░реНрди рд╣реИрдВ рдЬреЛ рдореИрдВрдиреЗ рдПрд╕рд┐рдВрдХреЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЦреЛрдЬреЗ рдереЗред
рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ:
рдореИрдВрдиреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рд╣реИрдХрд░ рдиреНрдпреВрдЬрд╝ рдПрдкреАрдЖрдИ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ aiohttp рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд░рд▓ рдФрд░ рдкреНрд░рд╕рд┐рджреНрдз рд╕рд╛рдЗрдЯ рд╣реИ рдЬреЛ рдПрдХ рдкрд░рд┐рдЪрд┐рдд рдЙрдкрдпреЛрдЧ рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреА рд╣реИред рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкрд╛рдпрдерди 3.5 рдореЗрдВ рдкреЗрд╢ рдХрд┐рдП рдЧрдП async / рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдпрд╣ рдорд╛рдирд╛ рдХрд┐ рдкрд╛рдардХ рдпрд╣рд╛рдБ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдерд╛ред рдФрд░ рдЕрдВрддрддрдГ, рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдЧрд┐рдЯрд╣рдм рднрдВрдбрд╛рд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
рдареАрдХ рд╣реИ, рдЪрд▓реЛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУ!
рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЛрд░рд╛рдЯрд╛рдЗрди
рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрдирд╛рдирд╛ рдФрд░ рдЪрд▓рд╛рдирд╛ asyncio рдореЗрдВ рддреБрдЪреНрдЫ рд╣реИред рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, API рдореЗрдВ AbstractEventLoop рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЖрдо рддреМрд░ рдкрд░ рдЖрдк рдЗрди рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЗрд╕ рдпреЛрдЬрдирд╛ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдФрд░ рдЕрдиреНрдп рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╕рд╛рдзрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрд░рдЯрд╛рдЗрди рдХреА рд╕рд╛рджрдЧреА рдХреЛ рднреА рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
Asyncio рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реЗрдм рдХреНрд░реЙрд▓рд░ рдмрдирд╛рдирд╛ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдо рд╕рд┐рд░реНрдл HackerNews рдкрд░ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдореЗрдВ рд╡реНрдпрд╕реНрдд рд╣реИрдВ, рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдЕрдЪреНрдЫреЗ рд╣реЛрд▓реАрд╡рд░ рдХреА рддрд░рд╣ рд╣реЛрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдПрдХ рдРрд╕реА рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ HN рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИ рдФрд░ рдпрджрд┐ рдпрд╣ рд╕реАрдорд╛ рд╕реЗ рдКрдкрд░ рд╣реИ рддреЛ рдЖрдкрдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддреА рд╣реИред рдЖрдкрдиреЗ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЧреБрдорд░рд╛рд╣ рдХрд┐рдпрд╛ рдФрд░ HN API рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдкрд╛рдпрд╛, рдмрд╕ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛:
рд▓реЗрдЦ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдкреЗрдбрд╝ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рдУ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЧрд┐рдиреЛред
рдХреЙрд▓ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛!
""" , , . , Hacker News """ import asyncio import argparse import logging from urllib.parse import urlparse, parse_qs from datetime import datetime import aiohttp import async_timeout LOGGER_FORMAT = '%(asctime)s %(message)s' URL_TEMPLATE = "https://hacker-news.firebaseio.com/v0/item/{}.json" FETCH_TIMEOUT = 10 parser = argparse.ArgumentParser(description='Calculate the comments of a Hacker News post.') parser.add_argument('--id', type=int, default=8863, help='ID of the post in HN, defaults to 8863') parser.add_argument('--url', type=str, help='URL of a post in HN') parser.add_argument('--verbose', action='store_true', help='Detailed output') logging.basicConfig(format=LOGGER_FORMAT, datefmt='[%H:%M:%S]') log = logging.getLogger() log.setLevel(logging.INFO) fetch_counter = 0 async def fetch(session, url): """ URL aiohttp, JSON . aiohttp . """ global fetch_counter with async_timeout.timeout(FETCH_TIMEOUT): fetch_counter += 1 async with session.get(url) as response: return await response.json() async def post_number_of_comments(loop, session, post_id): """ . """ url = URL_TEMPLATE.format(post_id) now = datetime.now() response = await fetch(session, url) log.debug('{:^6} > Fetching of {} took {} seconds'.format( post_id, url, (datetime.now() - now).total_seconds())) if 'kids' not in response:
рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП "-verbose" рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред
[14:47:32] > Calculating comments took 2.23 seconds and 73 fetches [14:47:32] -- Post 8863 has 72 comments
рдЪрд▓реЛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ рдФрд░ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЛрд░рдЖрдЙрдЯ рдореЗрдВ рд╕реАрдзреЗ рдЬрд╛рдПрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдХреЛрдб рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрдврд╝рд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ред
async def post_number_of_comments(loop, session, post_id): """ . """ url = URL_TEMPLATE.format(post_id) now = datetime.now() response = await fetch(session, url) log.debug('{:^6} > Fetching of {} took {} seconds'.format( post_id, url, (datetime.now() - now).total_seconds())) if 'kids' not in response:
- рдкрд╣рд▓реЗ рд╣рдо JSON рдХреЛ рдкреЛрд╕реНрдЯ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
- рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкреБрди: рднреНрд░рдордг рдХрд░реЗрдВред
- рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЖрдзрд╛рд░ рдорд╛рдорд▓реЗ рддрдХ рдкрд╣реБрдБрдЪреЗрдВрдЧреЗ рдФрд░ рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдХрд░реЗрдВрдЧреЗ,
рдЬрдм рдкреЛрд╕реНрдЯ рдХрд╛ рдХреЛрдИ рдлреАрдбрдмреИрдХ рдирд╣реАрдВ рд╣реИред - рдЖрдзрд╛рд░ рдорд╛рдорд▓реЗ рд╕реЗ рд▓реМрдЯрддреЗ рд╕рдордп, рдЙрддреНрддрд░ рдХреЛ рд╡рд░реНрддрдорд╛рди рдкреЛрд╕реНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
рд╡рд╛рд░рд┐рд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╡рд╛рдкрд╕реА
рдмреНрд░реЗрдЯ рд╕реНрд▓реЗрдЯрдХрд┐рди рдиреЗ рдлреИрди-рдЗрди рдФрд░ рдлреИрди-рдЖрдЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рдХрд╛ рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ , рд╣рдо рд╡рд╛рд░рд┐рд╕реЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреИрди-рдЖрдЙрдЯ рд╣реИрдВ рдФрд░ рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдиреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рд╣реИ
рдЗрди рдлреИрди-рдЖрдЙрдЯ рдСрдкрд░реЗрд╢рди рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП asyncio API рдореЗрдВ рдХреБрдЫ рддрд░реАрдХреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдореИрдВ рдПрдХрддреНрд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╕рднреА рдХреЛрд░рдЯрд╛рдЗрди рдХреЛ рдЕрдкрдиреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИред
рдЖрдЗрдП рд╣рдо рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдПрдХ рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреЙрд░рдЯреЙрдпрдиреНрд╕ рдореМрдЬреВрдж рд╣реИрдВ, рдХреЙрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджреМрд░рд╛рди рдЙрдирдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдИ / рдУ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдПрдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдФрд░ (рдЖрд╕рд╛рдиреА рд╕реЗ) рдкрдардиреАрдп рдХреЙрд░рдЯрд┐рди рдореЗрдВ рдЬрдЯрд┐рд▓ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
"рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ," рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ? рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдПрдХ рдкрд╛рдпрджрд╛рди рдКрдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред
рдЧреЛрд▓реА рдорд╛рд░ рджреА рдФрд░ рднреВрд▓ рдЧрдпрд╛
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЙрди рдкреЛрд╕реНрдЯреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдИ-рдореЗрд▓ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп рд╕реЗ рдЕрдзрд┐рдХ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВ, рдФрд░ рдЖрдк рдЗрд╕реЗ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рд╣рдо рдкреЛрд╕реНрдЯ рдЯреНрд░реА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЧрдП рдереЗред рд╣рдо рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЗрд╡рд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
async def post_number_of_comments(loop, session, post_id): """ . """ url = URL_TEMPLATE.format(post_id) response = await fetch(session, url) if 'kids' not in response:
рд╣рд╛рдВ, рдореИрдВрдиреЗ asyncio.sleep рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рдпрд╣ рдЖрдЦрд┐рд░реА рдмрд╛рд░ рд╣реИред рдореИрдВ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реВрдВред
[09:41:02] Post logged [09:41:04] Post logged [09:41:06] Post logged [09:41:06] > Calculating comments took 6.35 seconds and 73 fetches [09:41:06] -- Post 8863 has 72 comments
рдпрд╣ рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдзреАрдорд╛ рд╣реИ!
рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХреА рдереА, рднрд╡рд┐рд╖реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдХреЛрд░рдЯрд╛рдЗрди рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред
рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХреЙрд░рдЖрдЙрдЯ рдХреЗ рд╕рд╛рде "рд╢реВрдЯ рдФрд░ рднреВрд▓рдиреЗ" рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдФрд░ рдЪреВрдБрдХрд┐ рд╣рдо рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рд╣рдореЗрдВ рдмрд┐рдирд╛ рд░реБрдХреЗ рдХреЙрд░рдЖрдЙрдЯ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд░рд╛рд╕реНрддрд╛ рдЪрд╛рд╣рд┐рдПред Asyncio рдПрдкреАрдЖрдИ рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ_рдлрд┐рдирд╛рдЗрд▓ рдлрд╝рдВрдХреНрд╢рди рдорд┐рд▓реЗрдЧрд╛ рдЬреЛ рдХреЛрд░рдЯрд╛рдЗрди рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрдбреНрдпреВрд▓ рдХрд░реЗрдЧрд╛, рдЗрд╕реЗ рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓рдкреЗрдЯреЗрдЧрд╛ , рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдпрд╣ рдпрд╛рдж рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдХреЛрд░рдЯрд╛рдЗрди рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдЧрдИ рдереА, рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдПрдХ рдЪрдХреНрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рд╣рдорд╛рд░реЗ рдХреЛрд░рдЖрдЙрдЯ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛, рдЬрдм рдПрдХ рдФрд░ рдХреЛрд░рдЖрдЙрдЯ рдЙрдореНрдореАрдж рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛрдЧрд╛ред
рдорд╣рд╛рди, рдЖрдЗрдП рдирд┐рдореНрди рдХреЗ рд░реВрдк рдореЗрдВ log_post рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ:
async def post_number_of_comments(loop, session, post_id): """ . """ url = URL_TEMPLATE.format(post_id) response = await fetch(session, url) if 'kids' not in response:
[09:42:57] > Calculating comments took 1.69 seconds and 73 fetches [09:42:57] -- Post 8863 has 72 comments [09:42:57] Task was destroyed but it is pending! task: <Task pending coro=<log_post() done, defined at 02_fire_and_forget.py:82> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x1109197f8>()]>> [09:42:57] Task was destroyed but it is pending! task: <Task pending coro=<log_post() done, defined at 02_fire_and_forget.py:82> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x110919948>()]>> [09:42:57] Task was destroyed but it is pending! task: <Task pending coro=<log_post() done, defined at 02_fire_and_forget.py:82> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x110919978>()]>>
рдЕрд╣рдо, рднрдпрд╛рдирдХ рдХрд╛рд░реНрдп рдирд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдпрд╣ рд▓рдВрдмрд┐рдд рд╣реИ! рджреБрдирд┐рдпрд╛ рднрд░ рдореЗрдВ asyncio рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕рддрд╛ред рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЙрд╕ рд╕рдордп рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЧрдП рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдерд╛ (1.69 рдкреАред), рдмреБрд░реА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдПрд╕рд┐рдВрдХреЛрдпреЛ рдХреЛ рд╢реЙрдЯ-рдПрдВрдб-рднреВрд▓ рд╢реНрд░реЗрдгреА рд╕реЗ рдкрд░реЗ рдЬрд╛рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдп log_post рд╕рдордп рдХреЛ рдкреВрд░рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдкреЛрд╕реНрдЯ_number_of_comments coroutine рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЬрдмрд░рджрд╕реНрддреА рдЗрд╡реЗрдВрдЯ рд▓реВрдк рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
рд╣рдо рдпрд╛ рддреЛ рдЗрд╡реЗрдВрдЯ рд▓реВрдк рдХреЛ рд░рди_ рдЕрдлрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рд╣рдо рд╕рднреА рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рд╕реНрдХ рдХреНрд▓рд╛рд╕ рдХреА рдСрд▓_рдЯреНрдпреВрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред
рдЪрд▓рд┐рдП рдкреЛрд╕реНрдЯ_рдирдВрдмрд░_рдСрдл_рдХреЙрдореНрдореЗрдВрдЯреНрд╕ рдХреЗ рд╣рдорд╛рд░реЗ рдХреЙрд▓ рдХреЗ рдмрд╛рдж рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдХреЗ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:
if __name__ == '__main__': args = parser.parse_args() if args.verbose: log.setLevel(logging.DEBUG) post_id = id_from_HN_url(args.url) if args.url else args.id loop = asyncio.get_event_loop() with aiohttp.ClientSession(loop=loop) as session: now = datetime.now() comments = loop.run_until_complete( post_number_of_comments(loop, session, post_id)) log.info( '> Calculating comments took {:.2f} seconds and {} fetches'.format( (datetime.now() - now).total_seconds(), fetch_counter)) log.info("-- Post {} has {} comments".format(post_id, comments)) pending_tasks = [ task for task in asyncio.Task.all_tasks() if not task.done()] loop.run_until_complete(asyncio.gather(*pending_tasks)) loop.close()
[09:47:29] > Calculating comments took 1.72 seconds and 73 fetches [09:47:29] тАФ Post 8863 has 72 comments [09:47:30] Post logged [09:47:31] Post logged [09:47:32] Post logged
рдЕрдм рд╣рдореЗрдВ рдпрдХреАрди рд╣реИ рдХрд┐ рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛рд░реНрдп рдкреВрд░реНрдг рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВред
рдпрд╣ рдзрд╛рд░рдгрд╛ рдХрд┐ рдСрд▓_рдЯреЗрд╕ рд╡рд┐рдзрд┐ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдареАрдХ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдЬрд┐рдирд╕реЗ рд╣рдо рдирд┐рдкрдЯ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рдмрдврд╝рд┐рдпрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬрдм рд╣рдорд╛рд░реЗ рдИрд╡реЗрдВрдЯ рд▓реВрдк рдореЗрдВ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╕реНрд░реЛрдд рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЗ рдмрд╛рд╣рд░ рд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред ред
рдПрдХ рдЕрдиреНрдп рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдП рдЧрдП рд╕рднреА рдХрд╛рд░рдЖрдЙрдЯреНрд╕ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдмрд╛рдж рдЖрджреЗрд╢ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░реЗрдВ, рдЬрд┐рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдердЧрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛,
рдЬреИрд╕реЗ рд╣реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЧрд┐рдирддреА рдкреВрд░реА рд╣реЛрддреА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, ens_future рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЯрд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдмрд╕ рдПрдХ рдХрд╛рд░реНрдп_рд╕реВрдЪреА рд╕реВрдЪреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдХреЛ рд╕рдВрдЪрд┐рдд рдХрд░реЗрдВ:
async def post_number_of_comments(loop, session, post_id): """Retrieve data for current post and recursively for all comments. """ url = URL_TEMPLATE.format(post_id) response = await fetch(session, url) if 'kids' not in response:
[09:53:46] > Calculating comments took 1.68 seconds and 73 fetches [09:53:46] тАФ Post 8863 has 72 comments [09:53:46] Post logged [09:53:48] Post logged [09:53:49] Post logged
рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдмрдХ рд╕реАрдЦрддреЗ рд╣реИрдВ - рдПрд╕рд┐рдВрдХреЛ рдХреЛ рдЕрдЬрд╡рд╛рдЗрди рдХреА рддрд░рд╣ рд╡рд┐рддрд░рд┐рдд рдХрд╛рд░реНрдп рдХрддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рдзрд╛рдЧреЗ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЪрдХреНрд░ рдХреЛ рддрджрдиреБрд╕рд╛рд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЬреЛ рдЕрдиреНрдп рдЖрдо рддреМрд░ рдкрд░ рд╕реНрд╡реАрдХреГрдд рдкреИрдЯрд░реНрди рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ:
рд╕рдордп-рд╕рдордп рдкрд░ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдХреЛрд░рдЯрд╛рдЗрди
рдПрдЪрдПрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рд╣реИ (рдФрд░ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛), рд╣рдордиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛
рдЬреЛ рдЙрдкрд▓рдмреНрдз рд╣реЛрддреЗ рд╣реА HN рдкреНрд░рдХрд╛рд╢рди рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдгрд╛рдпрдХ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдФрд░ рд╡реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ 5 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╣реИрдВред
рдПрдЪрдПрди рдПрдкреАрдЖрдИ рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рдПрдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рджрд┐рдЦрд╛рддреА рд╣реИ рдЬреЛ рдкрд┐рдЫрд▓реЗ 500 рд░рд┐рдХреЙрд░реНрдб рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдорд╣рд╛рди, рдЗрд╕рд▓рд┐рдП рд╣рдо рдирдП рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЙрди рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрд╕ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рдорддрджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд░ рдкрд╛рдВрдЪ рд╕реЗрдХрдВрдб рдореЗрдВ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред
рдЦреИрд░, рдЪреВрдВрдХрд┐ рдЕрдм рд╣рдо рд╕рдордп-рд╕рдордп рдкрд░ рдорддрджрд╛рди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рдмрд╕ рд▓реВрдк рдХрд░рддреЗ рд╕рдордп рдЕрдирдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдорддрджрд╛рди рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ ( рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ), рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕реЛ рдЬрд╛рдПрдВ (рдХреЙрд▓ рд╕реНрд▓реАрдк )ред рдореИрдВрдиреЗ рдбрд╛рдпрд░реЗрдХреНрдЯ рдкреЛрд╕реНрдЯ URL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╢реАрд░реНрд╖ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЫреЛрдЯреЗ рдмрджрд▓рд╛рд╡ рдХрд┐рдПред
""" An example of periodically scheduling coroutines using an infinite loop of awaiting and sleeping. """ import asyncio import argparse import logging from datetime import datetime import aiohttp import async_timeout LOGGER_FORMAT = '%(asctime)s %(message)s' URL_TEMPLATE = "https://hacker-news.firebaseio.com/v0/item/{}.json" TOP_STORIES_URL = "https://hacker-news.firebaseio.com/v0/topstories.json" FETCH_TIMEOUT = 10 parser = argparse.ArgumentParser(description='Calculate the number of comments of the top stories in HN.') parser.add_argument('--period', type=int, default=5, help='Number of seconds between poll') parser.add_argument('--limit', type=int, default=5,help='Number of new stories to calculate comments for') parser.add_argument('--verbose', action='store_true', help='Detailed output') logging.basicConfig(format=LOGGER_FORMAT, datefmt='[%H:%M:%S]') log = logging.getLogger() log.setLevel(logging.INFO) fetch_counter = 0 async def fetch(session, url): """ URL aiohttp, JSON . aiohttp . """ global fetch_counter with async_timeout.timeout(FETCH_TIMEOUT): fetch_counter += 1 async with session.get(url) as response: return await response.json() async def post_number_of_comments(loop, session, post_id): """ . """ url = URL_TEMPLATE.format(post_id) response = await fetch(session, url) if 'kids' not in response:
[10:14:03] Calculating comments for top 5 stories. (1) [10:14:06] Post 13848196 has 31 comments (1) [10:14:06] Post 13849430 has 37 comments (1) [10:14:06] Post 13849037 has 15 comments (1) [10:14:06] Post 13845337 has 128 comments (1) [10:14:06] Post 13847465 has 27 comments (1) [10:14:06] > Calculating comments took 2.96 seconds and 244 fetches [10:14:06] Waiting for 5 secondsтАж [10:14:11] Calculating comments for top 5 stories. (2) [10:14:14] Post 13848196 has 31 comments (2) [10:14:14] Post 13849430 has 37 comments (2) [10:14:14] Post 13849037 has 15 comments (2) [10:14:14] Post 13845337 has 128 comments (2) [10:14:14] Post 13847465 has 27 comments (2) [10:14:14] > Calculating comments took 3.04 seconds and 244 fetches [10:14:14] Waiting for 5 secondsтАж
рдорд╣рд╛рди, рд▓реЗрдХрд┐рди рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдпрджрд┐ рдЖрдкрдиреЗ рд╕рдордп рдЯрд┐рдХрдЯ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛,
рддрдм рдХрд╛рд░реНрдп рд╣рд░ 5 рд╕реЗрдХрдВрдб рдореЗрдВ рд╕рдЦреНрддреА рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ get_comments_of_top_stories рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ 5 рд╕реЗрдХрдВрдб рдмрд╛рдж рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЬрдм рддрдХ рд╣рдо рдЕрдкрдиреЗ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд▓реЗрддреЗ рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдФрд░ рдЕрд╡рд░реЛрдзрди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдоред
рдЬрдм рдпрд╣ рдХрд╛рд░реНрдп рдкрд╛рдВрдЪ рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрддрд╛ рд╣реИ, рддреЛ рдпреЗ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм coroutine рдХреЛ рдЕрдирдВрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рддреЛ _run_until рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИред
рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рд╣рдо ens_future рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реИрдВ, рдФрд░ рд╣рдо рдХреЗрд╡рд▓ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ рдзрдХреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ ...
async def poll_top_stories_for_comments(loop, session, period, limit): """ . """ global fetch_counter iteration = 1 while True: now = datetime.now() log.info("Calculating comments for top {} stories. ({})".format( limit, iteration)) asyncio.ensure_future( get_comments_of_top_stories(loop, session, limit, iteration)) log.info( '> Calculating comments took {:.2f} seconds and {} fetches'.format( (datetime.now() - now).total_seconds(), fetch_counter)) log.info("Waiting for {} seconds...".format(period)) iteration += 1 fetch_counter = 0 await asyncio.sleep(period)
[10:55:40] Calculating comments for top 5 stories. (1) [10:55:40] > Calculating comments took 0.00 seconds and 0 fetches [10:55:40] Waiting for 5 secondsтАж [10:55:43] Post 13848196 has 32 comments (1) [10:55:43] Post 13849430 has 48 comments (1) [10:55:43] Post 13849037 has 16 comments (1) [10:55:43] Post 13845337 has 129 comments (1) [10:55:43] Post 13847465 has 29 comments (1) [10:55:45] Calculating comments for top 5 stories. (2) [10:55:45] > Calculating comments took 0.00 seconds and 260 fetches [10:55:45] Waiting for 5 secondsтАж [10:55:48] Post 13848196 has 32 comments (2) [10:55:48] Post 13849430 has 48 comments (2) [10:55:48] Post 13849037 has 16 comments (2) [10:55:48] Post 13845337 has 129 comments (2) [10:55:48] Post 13847465 has 29 comments (2)
рдЕрд╣рдо ... рдареАрдХ рд╣реИ, рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдареАрдХ рдкрд╛рдВрдЪ рд╕реЗрдХрдВрдб рдмрд╛рдж рд╕реНрдерд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди 0.00 рд╕реЗрдХрдВрдб рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рдирдореВрдиреЗ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЕрдЧрд▓рд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╢реВрдиреНрдп рд╕реЗрдХрдВрдб рдФрд░ 260 рдирдореВрдиреЗ рд▓реЗрддрд╛ рд╣реИ?
рдпрд╣ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЕрдм рд╣рдо рдХреЛрд░рдЯрд╛рдЗрди рдХреЛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд╕ рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╢реВрдиреНрдп рд╕реЗрдХрдВрдб рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░, рдкрд╣рд▓реА рдмрд╛рд░ рд╢реВрдиреНрдп рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпреЗ рдХрд╛рдлреА рдЫреЛрдЯреЗ рдХрд╛рд░реНрдп рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдмрд┐рдирд╛ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рдлрд┐рд░, рдореЗрд░реЗ рджреЛрд╕реНрдд, рд╣рдореЗрдВ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ ... рдХреЙрд▓рдмреИрдХ (рдХреНрд░рд┐рдВрдЧрд┐рдВрдЧ (())
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдХреЙрд▓рдЖрдЙрдЯ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд░рдЯрд╛рдЗрди рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрдЦ рдХрд╛ рдирд╛рдЯрдХреАрдп рдЙрдкрд╢реАрд░реНрд╖рдХ "рдмрд╛рд╣рд░ рдХрд╛ рдЗрдВрддрдЬрд╛рд░" рд╣реИред рдЕрдм рд╣рдо рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдореИрдиреБрдЕрд▓ рд▓реЙрдиреНрдЪ рдХреЗ рд╕рд╛рде рд░реЛрдорд╛рдВрдЪ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ? рд╕реНрдкреЙрдЗрд▓рд░
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ _future рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо _add_done рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрд▓рдмреИрдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рд╣реА рднреНрд░реВрдг рдХреА рдЧрд┐рдирддреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ URLFetcher рд╡рд░реНрдЧ рдореЗрдВ рдЕрдкрдиреЗ рдирд┐рд╖реНрдХрд░реНрд╖рдг рдХреЛрдЖрдЙрдЯреАрди рдХреЛ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирдореВрдиреЛрдВ рдХреА рд╕рд╣реА рдЧрд┐рдирддреА рд╣реЛред рд╡реИрд╕реЗ рднреА рдмрдЧ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡реИрд╢реНрд╡рд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рд╣рдо рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ:
""" ensure_future sleep. future, ensure_future, , URLFetcher . """ import asyncio import argparse import logging from datetime import datetime import aiohttp import async_timeout LOGGER_FORMAT = '%(asctime)s %(message)s' URL_TEMPLATE = "https://hacker-news.firebaseio.com/v0/item/{}.json" TOP_STORIES_URL = "https://hacker-news.firebaseio.com/v0/topstories.json" FETCH_TIMEOUT = 10 parser = argparse.ArgumentParser(description='Calculate the number of comments of the top stories in HN.') parser.add_argument('--period', type=int, default=5, help='Number of seconds between poll') parser.add_argument('--limit', type=int, default=5, help='Number of new stories to calculate comments for') parser.add_argument('--verbose', action='store_true', help='Detailed output') logging.basicConfig(format=LOGGER_FORMAT, datefmt='[%H:%M:%S]') log = logging.getLogger() log.setLevel(logging.INFO) class URLFetcher(): """ URL """ def __init__(self): self.fetch_counter = 0 async def fetch(self, session, url): """ URL aiohttp, JSON . aiohttp . """ with async_timeout.timeout(FETCH_TIMEOUT): self.fetch_counter += 1 async with session.get(url) as response: return await response.json() async def post_number_of_comments(loop, session, fetcher, post_id): """ . """ url = URL_TEMPLATE.format(post_id) response = await fetcher.fetch(session, url)
[12:23:40] Calculating comments for top 5 stories. (1) [12:23:40] Waiting for 5 seconds... [12:23:43] Post 13848196 has 38 comments (1) [12:23:43] Post 13849430 has 72 comments (1) [12:23:43] Post 13849037 has 19 comments (1) [12:23:43] Post 13848283 has 64 comments (1) [12:23:43] Post 13847465 has 34 comments (1) [12:23:43] > Calculating comments took 3.17 seconds and 233 fetches [12:23:45] Calculating comments for top 5 stories. (2) [12:23:45] Waiting for 5 seconds... [12:23:47] Post 13848196 has 38 comments (2) [12:23:47] Post 13849430 has 72 comments (2) [12:23:47] Post 13849037 has 19 comments (2) [12:23:47] Post 13848283 has 64 comments (2) [12:23:47] Post 13847465 has 34 comments (2) [12:23:47] > Calculating comments took 2.47 seconds and 233 fetches [12:23:50] Calculating comments for top 5 stories. (3) [12:23:50] Waiting for 5 seconds...
рдареАрдХ рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдХреЙрд▓рдмреИрдХ рдЕрдиреБрднрд╛рдЧ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ:
async def poll_top_stories_for_comments(loop, session, period, limit): """ . """ iteration = 1 while True: log.info("Calculating comments for top {} stories. ({})".format( limit, iteration)) future = asyncio.ensure_future( get_comments_of_top_stories(loop, session, limit, iteration)) now = datetime.now() def callback(fut): fetch_count = fut.result() log.info( '> Calculating comments took {:.2f} seconds and {} fetches'.format( (datetime.now() - now).total_seconds(), fetch_count)) future.add_done_callback(callback) log.info("Waiting for {} seconds...".format(period)) iteration += 1 await asyncio.sleep(period)
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рддрд░реНрдХ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдХреА рд╡рд╕реНрддреБ рд╕реНрд╡рдпрдВ рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рдПрдЧреАред рд╣рдо URLFetcher рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╕реЗ _get_comments_of_top рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рднреА рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ?рдореИрдВрдиреЗ рддреБрдорд╕реЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИ ред
callback-, API asyncio AbstractBaseLoop _call later _call at ,
- . , , poll_top_stories_for_comments :
def poll_top_stories_for_comments(loop, session, period, limit, iteration=0): """ get_comments_of_top_stories. """ log.info("Calculating comments for top {} stories ({})".format( limit, iteration)) future = asyncio.ensure_future( get_comments_of_top_stories(loop, session, limit, iteration)) now = datetime.now() def callback(fut): fetch_count = fut.result() log.info( '> Calculating comments took {:.2f} seconds and {} fetches'.format( (datetime.now() - now).total_seconds(), fetch_count)) future.add_done_callback(callback) log.info("Waiting for {} seconds...".format(period)) iteration += 1 loop.call_later( period, partial(
. :
- , ensure_future .
( : ) - _poll_top_stories_for comments , , _run forever , .
, , , тАФ ? ? URL:
MAXIMUM_FETCHES = 5 class URLFetcher(): """ URL """ def __init__(self): self.fetch_counter = 0 async def fetch(self, session, url): """ URL aiohttp, JSON . aiohttp . """ with async_timeout.timeout(FETCH_TIMEOUT): self.fetch_counter += 1 if self.fetch_counter > MAXIMUM_FETCHES: raise Exception('BOOM!') async with session.get(url) as response: return await response.json()
[12:51:00] Calculating comments for top 5 stories. (1) [12:51:00] Waiting for 5 secondsтАж [12:51:01] Exception in callback poll_top_stories_for_comments.<locals>.callback(<Task finisheтАжion('BOOM!',)>) at 05_periodic_coroutines.py:121 handle: <Handle poll_top_stories_for_comments.<locals>.callback(<Task finisheтАжion('BOOM!',)>) at 05_periodic_coroutines.py:121> Traceback (most recent call last): File тАЬ/Users/yeray/.pyenv/versions/3.6.0/lib/python3.6/asyncio/events.pyтАЭ, line 126, in _run self._callback(*self._args) File тАЬ05_periodic_coroutines.pyтАЭ, line 122, in callback fetch_count = fut.result() File тАЬ05_periodic_coroutines.pyтАЭ, line 100, in get_comments_of_top_stories results = await asyncio.gather(*tasks) File тАЬ05_periodic_coroutines.pyтАЭ, line 69, in post_number_of_comments response = await fetcher.fetch(session, url) File тАЬ05_periodic_coroutines.pyтАЭ, line 58, in fetch raise Exception('BOOM!') Exception: BOOM! [12:51:05] Calculating comments for top 5 stories. (2) [12:51:05] Waiting for 5 secondsтАж
, ?
рдХреНрдпрд╛ рдХрд░реЗрдВ? , , : asyncio :