Skip to content

Instantly share code, notes, and snippets.

@namnh68
Forked from numberoverzero/run_scheduled.py
Created April 22, 2018 16:19
Show Gist options
  • Save namnh68/42fba2bc019f54c3073c8a7edea2f279 to your computer and use it in GitHub Desktop.
Save namnh68/42fba2bc019f54c3073c8a7edea2f279 to your computer and use it in GitHub Desktop.

Revisions

  1. @numberoverzero numberoverzero renamed this gist Jul 18, 2017. 1 changed file with 9 additions and 21 deletions.
    30 changes: 9 additions & 21 deletions async_schedule.py → run_scheduled.py
    Original file line number Diff line number Diff line change
    @@ -54,26 +54,14 @@ async def periodic_func():

    # USAGE =====================================================

    def main():
    import signal
    loop = asyncio.new_event_loop()
    schedule = create_scheduler(loop=loop)
    loop = asyncio.new_event_loop()
    schedule = create_scheduler(loop=loop)

    feeds = {
    "http://feeds.abcnews.com/abcnews/topstories": None,
    "http://www.feedforall.com/sample.xml": None
    }
    update = FeedUpdater(feeds=feeds, loop=loop)
    refresh_task = schedule(update, interval=3)
    feeds = {
    "http://feeds.abcnews.com/abcnews/topstories": None,
    "http://www.feedforall.com/sample.xml": None
    }
    update = FeedUpdater(feeds=feeds, loop=loop)

    def stop_refresh(signal, frame):
    print("\nexiting...")
    refresh_task.cancel()
    loop.stop()
    signal.signal(signal.SIGINT, stop_refresh)

    loop.run_forever()


    if __name__ == "__main__":
    main()
    refresh_task = schedule(update, interval=3)
    loop.run_forever()
  2. @numberoverzero numberoverzero created this gist Jul 17, 2017.
    79 changes: 79 additions & 0 deletions async_schedule.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,79 @@
    import asyncio
    import functools
    import json
    import secrets

    import aiohttp

    from concurrent.futures import ALL_COMPLETED


    class FeedUpdater:
    def __init__(self, feeds, loop):
    self.feeds = feeds
    self.loop = loop
    self.session = aiohttp.ClientSession(loop=loop)

    async def _fetch(self, url):
    async with self.session.get(url) as response:
    status = response.status
    assert status == 200
    data = await response.text()
    return url, data

    async def __call__(self):
    tasks = [self._fetch(url) for url in self.feeds.keys()]
    done, pending = await asyncio.wait(
    tasks,
    loop=self.loop,
    return_when=ALL_COMPLETED
    )
    for task in done:
    url, data = task.result()
    self.feeds[url] = f"{len(data)}.{secrets.token_hex(4)}"

    # TODO placeholder
    print(json.dumps(self.feeds, sort_keys=True, indent=4))

    def __del__(self):
    self.session.close()

    def schedule(func, args=None, kwargs=None, interval=60, *, loop):
    if args is None:
    args = []
    if kwargs is None:
    kwargs = {}

    async def periodic_func():
    while True:
    await func(*args, **kwargs)
    await asyncio.sleep(interval, loop=loop)

    return loop.create_task(periodic_func())
    create_scheduler = lambda loop: functools.partial(loop=loop)

    # USAGE =====================================================

    def main():
    import signal
    loop = asyncio.new_event_loop()
    schedule = create_scheduler(loop=loop)

    feeds = {
    "http://feeds.abcnews.com/abcnews/topstories": None,
    "http://www.feedforall.com/sample.xml": None
    }
    update = FeedUpdater(feeds=feeds, loop=loop)
    refresh_task = schedule(update, interval=3)

    def stop_refresh(signal, frame):
    print("\nexiting...")
    refresh_task.cancel()
    loop.stop()
    signal.signal(signal.SIGINT, stop_refresh)

    loop.run_forever()


    if __name__ == "__main__":
    main()