In what way is grequests asynchronous?

后端 未结 3 440
余生分开走
余生分开走 2020-12-23 02:41

I\'ve been using the python requests library for some time, and recently had a need to make a request asynchronously, meaning I would like to send off the HTTP request, have

3条回答
  •  时光说笑
    2020-12-23 02:55

    If you don't want to use grequests you can just implement requests with callbacks using requests + the threading module from the standard library. It's actually really easy, and if all you want to do is send requests with callbacks the API is nicer than the one provided by grequests.

    from threading import Thread
    
    from requests import get, post, put, patch, delete, options, head
    
    
    
    request_methods = {
        'get': get,
        'post': post,
        'put': put,
        'patch': patch,
        'delete': delete,
        'options': options,
        'head': head,
    }
    
    
    def async_request(method, *args, callback=None, timeout=15, **kwargs):
        """Makes request on a different thread, and optionally passes response to a
        `callback` function when request returns.
        """
        method = request_methods[method.lower()]
        if callback:
            def callback_with_args(response, *args, **kwargs):
                callback(response)
            kwargs['hooks'] = {'response': callback_with_args}
        kwargs['timeout'] = timeout
        thread = Thread(target=method, args=args, kwargs=kwargs)
        thread.start()
    

    You can verify that it works like an AJAX calls in JS: you send a request on another thread, do some stuff on the main thread, and when the request returns you invoke a callback. This callback just prints out the response content.

    async_request('get', 'http://httpbin.org/anything', callback=lambda r: print(r.json()))
    for i in range(10):
        print(i)
    

提交回复
热议问题