Hey Guys,

The spooler can be sort of cumbersome to use sometimes due to it's
limitation of string-only arguments.  I've created the following
method that I use for development and production.  It allows me to run
any function in the spooler that's not a class method and pass any
arguments to it without worrying about picking beforehand.  It
executes synchronously on django's devserver and asynchronously when
the uwsgi module is available.

def make_async(func, *args, **kwargs):
    try:
        from custom.uwsgi_utils import _make_async
        body = kwargs.pop('body', None)
        _make_async.spool(
            func=pickle.dumps(func),
            args=pickle.dumps(args),
            kwargs=pickle.dumps(kwargs),
            body=pickle.dumps(body))
    except ImportError:
        func(*args, **kwargs)

and then _make_async is defined as:

@spool
def _make_async(args):
    """This should never be called directly, look at custom.utils.make_async"""

    func = pickle.loads(args['func'])
    fargs = pickle.loads(args['args'])
    fkwargs = pickle.loads(args['kwargs'])
    fbody = pickle.loads(args['body'])

    if fbody is not None:
        fkwargs.update({'body': fbody})

    func(*fargs, **fkwargs)

Example usage:

def my_fun(foo, bar=None, body=None):
  print foo, bar

  print body

make_async(my_fun, "Hello World", bar=1000, body="This can be a really
huge object")


Ryan-


On Thu, May 10, 2012 at 5:39 AM, Riccardo Magliocchetti
<[email protected]> wrote:
> Hello,
>
> Il 10/05/2012 14:33, Marco De Paoli ha scritto:
>
>> When you execute your python files outside uwsgi context (ex. for test
>> purposes) you are not able to import uwsgidecorators module
>> Because you get an ImportError: No module named uwsgi
>> This could be annoying.
>> I use a little trick to get out of this.
>> (The code refers the spool decorator but you can get the idea and apply it
>> to the others)
>>
>> try:
>>     from uwsgidecorators import spool
>> except ImportError:
>>     def spool(f):
>>         f.spool = f
>>         return f
>>
>> This way, when you test, you can make the same call but obtaining a
>> synchronous behaviour in place of a deferred one.
>> Obviously, in production (when you are running in uwsgi "shell") you
>> obtain
>> the uwsgi standard deferred behaviour
>
>
> I don't know how it would behave in your specific case but you can also take
> a look at contrib/upython, see:
> http://www.mail-archive.com/[email protected]/msg02994.html
>
> cheers,
> riccardo
> _______________________________________________
> uWSGI mailing list
> [email protected]
> http://lists.unbit.it/cgi-bin/mailman/listinfo/uwsgi
_______________________________________________
uWSGI mailing list
[email protected]
http://lists.unbit.it/cgi-bin/mailman/listinfo/uwsgi

Reply via email to