> Hi,
>
> I am tying to best take advantage the gevent loop in uWSGI to make
> async redis calls using redis-py.
>
> Per the uWSGI docs at http://projects.unbit.it/uwsgi/wiki/AsyncSupport
>
> """every time the uWSGI server calls yield it stops the execution of
> the app and accept a new request or resume a previously stopped
> request. """
>
> So, redis-py is blocking.  So, if I want to make a redis call ...lets
> say the call takes 15 ms, in the mean time, I can process more
> requests and when the resutks are ready then continue on my merry way?
>
> Where I am confused is to best use yield.
>
> Do a call gevent.joinall(jt) or yield gevent.joinall(jt) or none of
> the above.  From the below, I want to make two pipeline requests and
> not have the main loop block.
>
>
> Below is my code using bottle:
>
> def execute_pipe(pipe):
>     data = pipe.execute()
>     return data
>
> @post('/')
> def my_post():
>
>    #Get post data here
>
>     pipe_threads = []
>     p1 = r_main_writes.pipeline()
>     p1.hgetall(mab_profile1)
>     pipe_threads.append(p1)
>     p2 = r_other_writes.pipeline()
>     p2.hgetall(mab_profile2)
>     pipe_threads.append(p2)
>
>     jt = []
>     for pt in pipe_threads:
>         jt.append(gevent.spawn(execute_pipe, pt))
>     gevent.joinall(jt)
>
>


If you call joinall() the request will wait 'til all of the pipe_threads
will end. This is enough to stop WSGI callable execution. The latest yield
will be required for sending a body to the client.

If (instead) you want the pipe_threads to work in background and send
output to the client as soon as possibile, remove the joinall() call
In that way pipe_threads will continue running after the end of the request.


-- 
Roberto De Ioris
http://unbit.it
_______________________________________________
uWSGI mailing list
[email protected]
http://lists.unbit.it/cgi-bin/mailman/listinfo/uwsgi

Reply via email to