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