Hello,

Thanks for the great uwsgi web server, it's very useful.  I'm
currently porting my application from Flup to UWSGI, and encounter an
issue with process synchronization.  I'm trying to find a way to
ensure only one process at a time can perform a specific expensive
task that happens rarely.

I have defined a Python context manager for this:

class UWSGILock():
    def __enter__(self):
        import uwsgi
        uwsgi.lock()

    def __exit__(self, exc_type, exc_val, exc_tb):
        import uwsgi
        uwsgi.unlock()
        return False

I use it like this:

with UWSGILock():
    doSomeExpensiveStuff()

I run uwsgi like this:

uwsgi -s /tmp/uwsgi.sock -M -p2 -C -i -w server --pythonpath ..

However uwsgi crashes on unlock(), see attached gdb backtrace.

Details:

* UWSGI 0.9.6
* Ubuntu 9.10 64 bit
* Python 2.6.4

Maybe I should refrain from using the undocumented lock() and unlock()
functions?  Any idea how I can implement UWSGI inter-process
synchronization?

Also, is there a way to access the current UWSGI process and store
attributes on it?  I'd like to be able to attach a Memcache client to
every UWSGI process.

Thanks in advance,
-- 
Jean-Baptiste Quenot
*** Starting uWSGI 0.9.6 (64bit) on [Fri Sep  3 10:34:57 2010] ***
compiled with version: 4.4.1
Python version: 2.6.4 (r264:75706, Dec  7 2009, 18:59:58) 
[GCC 4.4.1]
 *** WARNING: you are running uWSGI without its master process manager ***
your memory page size is 4096 bytes
allocated 624 bytes (0 KB) for 1 request's buffer.
binding on UNIX socket: /tmp/uwsgi.sock
chmod() socket to 666 for lazy and brave users
your server socket listen backlog is limited to 64 connections
added .. to pythonpath.
initializing hooks...done.
[New Thread 0x7fffe524f910 (LWP 20181)]
Loading...

Program received signal SIGSEGV, Segmentation fault.
__pthread_mutex_unlock (mutex=0xa0) at pthread_mutex_unlock.c:289
289     pthread_mutex_unlock.c: No such file or directory.
        in pthread_mutex_unlock.c
(gdb) bt
#0  __pthread_mutex_unlock (mutex=0xa0) at pthread_mutex_unlock.c:289
#1  0x0000000000414a41 in py_uwsgi_unlock (self=0x0, args=0x7ffff7f91050) at 
uwsgi_pymodule.c:191
#2  0x00007ffff7183cf4 in call_function (f=0x212ace0, throwflag=<value 
optimized out>) at ../Python/ceval.c:3706
#3  PyEval_EvalFrameEx (f=0x212ace0, throwflag=<value optimized out>) at 
../Python/ceval.c:2389
#4  0x00007ffff7185975 in PyEval_EvalCodeEx (co=0xdf0120, globals=<value 
optimized out>, locals=<value optimized out>, args=0x4, argcount=<value 
optimized out>, kws=<value optimized out>, kwcount=0, defs=0x0, defcount=0, 
closure=0x0) at ../Python/ceval.c:2968
#5  0x00007ffff710de80 in function_call (func=0xdf57d0, arg=0x2203838, kw=0x0) 
at ../Objects/funcobject.c:524
#6  0x00007ffff70e1e53 in PyObject_Call (func=0xdf57d0, arg=0x7ffff7f91050, 
kw=0x414a1b) at ../Objects/abstract.c:2492
#7  0x00007ffff70f264f in instancemethod_call (func=0xdf57d0, arg=0x2203838, 
kw=0x0) at ../Objects/classobject.c:2579
#8  0x00007ffff70e1e53 in PyObject_Call (func=0x1eac730, arg=0x7ffff7f91050, 
kw=0x414a1b) at ../Objects/abstract.c:2492
#9  0x00007ffff70e5506 in PyObject_CallFunctionObjArgs (callable=0x1eac730) at 
../Objects/abstract.c:2723
#10 0x00007ffff717f964 in PyEval_EvalFrameEx (f=0x13a7b90, throwflag=<value 
optimized out>) at ../Python/ceval.c:2350
#11 0x00007ffff7185975 in PyEval_EvalCodeEx (co=0x10110a8, globals=<value 
optimized out>, locals=<value optimized out>, args=0x2, argcount=<value 
optimized out>, kws=<value optimized out>, kwcount=0, defs=0x0, defcount=0, 
closure=0x0) at ../Python/ceval.c:2968
#12 0x00007ffff7183b0f in fast_function (f=0xff8cb0, throwflag=<value optimized 
out>) at ../Python/ceval.c:3802
#13 call_function (f=0xff8cb0, throwflag=<value optimized out>) at 
../Python/ceval.c:3727
#14 PyEval_EvalFrameEx (f=0xff8cb0, throwflag=<value optimized out>) at 
../Python/ceval.c:2389
#15 0x00007ffff7185975 in PyEval_EvalCodeEx (co=0x1011030, globals=<value 
optimized out>, locals=<value optimized out>, args=0x1, argcount=<value 
optimized out>, kws=<value optimized out>, kwcount=0, defs=0x0, defcount=0, 
closure=0x0) at ../Python/ceval.c:2968
#16 0x00007ffff7183b0f in fast_function (f=0x2121160, throwflag=<value 
optimized out>) at ../Python/ceval.c:3802
#17 call_function (f=0x2121160, throwflag=<value optimized out>) at 
../Python/ceval.c:3727
#18 PyEval_EvalFrameEx (f=0x2121160, throwflag=<value optimized out>) at 
../Python/ceval.c:2389
#19 0x00007ffff7185975 in PyEval_EvalCodeEx (co=0x100d828, globals=<value 
optimized out>, locals=<value optimized out>, args=0x2, argcount=<value 
optimized out>, kws=<value optimized out>, kwcount=0, defs=0x0, defcount=0, 
closure=0x0) at ../Python/ceval.c:2968
#20 0x00007ffff7183b0f in fast_function (f=0x2120f60, throwflag=<value 
optimized out>) at ../Python/ceval.c:3802
#21 call_function (f=0x2120f60, throwflag=<value optimized out>) at 
../Python/ceval.c:3727
#22 PyEval_EvalFrameEx (f=0x2120f60, throwflag=<value optimized out>) at 
../Python/ceval.c:2389
#23 0x00007ffff7185975 in PyEval_EvalCodeEx (co=0x7ffff7ef7918, globals=<value 
optimized out>, locals=<value optimized out>, args=0x2, argcount=<value 
optimized out>, kws=<value optimized out>, kwcount=0, defs=0x20f2e68, 
defcount=1, closure=0x0) at ../Python/ceval.c:2968
#24 0x00007ffff7183b0f in fast_function (f=0x1e3b720, throwflag=<value 
optimized out>) at ../Python/ceval.c:3802
#25 call_function (f=0x1e3b720, throwflag=<value optimized out>) at 
../Python/ceval.c:3727
#26 PyEval_EvalFrameEx (f=0x1e3b720, throwflag=<value optimized out>) at 
../Python/ceval.c:2389
#27 0x00007ffff7184752 in fast_function (f=0x6c45f0, throwflag=<value optimized 
out>) at ../Python/ceval.c:3792
#28 call_function (f=0x6c45f0, throwflag=<value optimized out>) at 
../Python/ceval.c:3727
#29 PyEval_EvalFrameEx (f=0x6c45f0, throwflag=<value optimized out>) at 
../Python/ceval.c:2389
#30 0x00007ffff7185975 in PyEval_EvalCodeEx (co=0x7ffff7ef78a0, globals=<value 
optimized out>, locals=<value optimized out>, args=0x0, argcount=<value 
optimized out>, kws=<value optimized out>, kwcount=0, defs=0x0, defcount=0, 
closure=0x0) at ../Python/ceval.c:2968
#31 0x00007ffff7185a42 in PyEval_EvalCode (co=0xa0, globals=0x7ffff7f91050, 
locals=0x414a1b) at ../Python/ceval.c:522
#32 0x00007ffff7196d02 in PyImport_ExecCodeModuleEx (name=0x7fffffffcc50 
"server", co=0x7ffff7ef78a0, pathname=0x7fffffffaaf0 "./server.pyc") at 
../Python/import.c:675
#33 0x00007ffff71995ae in load_source_module (name=0x7fffffffcc50 "server", 
pathname=0x7fffffffaaf0 "./server.pyc", fp=<value optimized out>) at 
../Python/import.c:1015
#34 0x00007ffff719a455 in import_submodule (mod=0x625810, 
subname=0x7fffffffcc50 "server", fullname=0x7fffffffcc50 "server") at 
../Python/import.c:2589
#35 0x00007ffff719a6df in load_next (mod=0x625810, altmod=<value optimized 
out>, p_name=<value optimized out>, buf=0x7fffffffcc50 "server", 
p_buflen=<value optimized out>) at ../Python/import.c:2409
#36 0x00007ffff719ad32 in import_module_level (name=0x0, globals=<value 
optimized out>, locals=<value optimized out>, fromlist=0x7ffff7fc3d88, level=0) 
at ../Python/import.c:2131
#37 0x00007ffff719b2a4 in PyImport_ImportModuleLevel (name=0x7ffff7f0a084 
"server", globals=0x6ba490, locals=0x6ba490, fromlist=0x7ffff7fc3d88, 
level=<value optimized out>) at ../Python/import.c:2182
#38 0x00007ffff717d8ef in builtin___import__ (self=<value optimized out>, 
args=<value optimized out>, kwds=<value optimized out>) at 
../Python/bltinmodule.c:48
#39 0x00007ffff70e1e53 in PyObject_Call (func=0x7ffff7fb9098, 
arg=0x7ffff7f91050, kw=0x414a1b) at ../Objects/abstract.c:2492
#40 0x00007ffff70e479f in call_function_tail (callable=0x7ffff7fb9098, 
format=<value optimized out>) at ../Objects/abstract.c:2524
#41 PyObject_CallFunction (callable=0x7ffff7fb9098, format=<value optimized 
out>) at ../Objects/abstract.c:2548
#42 0x00007ffff719b3cd in PyImport_Import (module_name=0x7ffff7f0a060) at 
../Python/import.c:2769
#43 0x00007ffff719b59c in PyImport_ImportModule (name=<value optimized out>) at 
../Python/import.c:2042
#44 0x00000000004127f8 in uwsgi_wsgi_config (filename=0x0) at uwsgi.c:2433
#45 0x000000000040f620 in main (argc=11, argv=0x7fffffffe228, 
envp=0x7fffffffe288) at uwsgi.c:1084
_______________________________________________
uWSGI mailing list
[email protected]
http://lists.unbit.it/cgi-bin/mailman/listinfo/uwsgi

Reply via email to