Search code examples
pythonhttpasynchronouspython-requestsgrequests

Asynchronous requests don't work using GRequests


I'm working on a program. It reads urls from a file and then makes requests. But handlers don't get called.

Here is my code:

import grequests


def main():
    async_list =[]

    for site in extractsites():
        action_item = grequests.get('http://' + site, hooks={'response': handleresponse})
        async_list.append(action_item)

    grequests.map(async_list)


def extractsites():
    return ['google.com']


def handleresponse(response):
    print(response)


if __name__ == '__main__':
    main()

Could anyone see why it does not work?


Solution

  • The handler has to have different signature, other parameters could be passed:

    def handler(response, **kwargs):
        print(response, kwargs)
    

    Complete example:

    import grequests
    
    def main():
        async_list =[]
    
        for site in extractsites():
            action_item = grequests.get('http://' + site, hooks={'response': handleresponse})
            async_list.append(action_item)
    
        grequests.map(async_list)
    
    def extractsites():
        return ['google.com']
    
    def handleresponse(response, **kwargs):
        print(response, kwargs)
    
    if __name__ == '__main__':
        main()
    

    Or shorter:

    import grequests
    urls = ['http://google.com']
    handler = lambda response, **kwargs: print(response, kwargs)
    grequests.map(grequests.get(url, hooks={'response': handler}) for url in urls)