Search code examples
pythonpython-3.xasynchronouspython-pulsar

Python 3.5 async keyword


I am currently looking into pulsar for an asynchronous HTTP client.

The following example is in the docs:

from pulsar.apps import http

async with http.HttpClient() as session:
    response1 = await session.get('https://github.com/timeline.json')
    response2 = await session.get('https://api.github.com/emojis.json')

but when I try to execute it I get

async with http.HttpClient() as session:
         ^ SyntaxError: invalid syntax

It looks like the async keyword is not recognized. I am using Python 3.5.

Working example:

import asyncio

from pulsar.apps.http import HttpClient

async def my_fun():
                    async with HttpClient() as session:
                        response1 = await session.get('https://github.com/timeline.json')
                        response2 = await session.get('https://api.github.com/emojis.json')

                    print(response1)
                    print(response2)


loop  =  asyncio.get_event_loop() 
loop.run_until_complete(my_fun())

Solution

  • you can only use async with inside a coroutines, so you have to do this

    from pulsar.apps.http import HttpClient
    import pulsar
    
    async def my_fun():
        async with HttpClient() as session:
            response1 = await session.get('https://github.com/timeline.json')
            response2 = await session.get('https://api.github.com/emojis.json')
        return response1, response2 
    
    loop  =  pulsar.get_event_loop() 
    res1, res2 = loop.run_until_complete(my_fun()) 
    print(res1)
    print(res2)
    

    internally pulsar use asyncio, so you don't have to import it explicitly to use it, use it through pulsar


    as a side note, if you upgrade to python 3.6 you can use async list/set/etc comprehension

    from pulsar.apps.http import HttpClient
    import pulsar
    
    async def my_fun():
        async with HttpClient() as session:
            urls=['https://github.com/timeline.json','https://api.github.com/emojis.json']
            return [ await session.get(url) for url in urls]
    
    loop  =  pulsar.get_event_loop() 
    res1, res2 = loop.run_until_complete(my_fun()) 
    print(res1)
    print(res2)