Ok. I have a PyQt program using mysql as a database with mysqldb as my database client. I'm spawning qt threads to do all the work before I call a postevent to let my application know I'm done.
It turns out, however, that the thread locks in the middle of my run() call and never completes. I'm cross-posting this message as I'm not familiar with Python extension modules and I don't know if PyQt could have caused this, it is a Python bug (or feature) or if there is a problem in the mysqldb module code.
Here's my run call:
def run(self):
""" called after the thread is spawned """
try:
# never makes it through the quick_find_customer call....
self.data = quick_find.quick_find_customer(self.parameters)
print "quick find returned:",self.data
I traced through everything and it seems to be blocking in the mysql code:
def _execute(self, query, args):
# makes it into the function but ...
from types import ListType, TupleType
from sys import exc_info
# it never makes it this far....
try:
if args is None:
r = self._query(query)
Once it locks, I get the following backtrace (using a full debug build of Python/PyQt/etc.):
#0 0x4019fd49 in sigsuspend () from /lib/libc.so.6
#1 0x40033858 in __pthread_wait_for_restart_signal () from /lib/libpthread.so.0
#2 0x400300eb in pthread_cond_wait () from /lib/libpthread.so.0
#3 0x080b5c0e in PyThread_acquire_lock (lock=0x813d418, waitflag=1) at Python/thread_pthread.h:374
#4 0x080a5874 in lock_import () at Python/import.c:166
#5 0x080a81b2 in PyImport_ImportModuleEx (name=0x8182fc4 "types", globals=0x87f56a4, locals=0x8114484, fromlist=0x87f83f4)
at Python/import.c:1657
#6 0x080f617b in builtin___import__ (self=0x0, args=0x813ab0c) at Python/bltinmodule.c:40
#7 0x080f3ec6 in PyCFunction_Call (func=0x81379f0, arg=0x813ab0c, kw=0x0) at Objects/methodobject.c:79
#8 0x080cdd9b in PyObject_Call (func=0x81379f0, arg=0x813ab0c, kw=0x0) at Objects/abstract.c:1688
#9 0x0808ea7b in PyEval_CallObjectWithKeywords (func=0x81379f0, arg=0x813ab0c, kw=0x0) at Python/ceval.c:3058
#10 0x0808a3f8 in eval_frame (f=0x852f99c) at Python/ceval.c:1843
<snip>
#32 0x0808d204 in PyEval_EvalCodeEx (co=0x870c6b0, globals=0x871a6cc, locals=0x0, args=0x81e2d78, argcount=1, kws=0x0, kwcount=0,
defs=0x0, defcount=0, closure=0x0) at Python/ceval.c:2595
#33 0x080e30df in function_call (func=0x870f34c, arg=0x81e2d64, kw=0x0) at Objects/funcobject.c:374
#34 0x080cdd9b in PyObject_Call (func=0x870f34c, arg=0x81e2d64, kw=0x0) at Objects/abstract.c:1688
#35 0x080d6f80 in instancemethod_call (func=0x870f34c, arg=0x81e2d64, kw=0x0) at Objects/classobject.c:2292
#36 0x080cdd9b in PyObject_Call (func=0x8582af4, arg=0x81e2d64, kw=0x0) at Objects/abstract.c:1688
#37 0x0808ea7b in PyEval_CallObjectWithKeywords (func=0x8582af4, arg=0x81e2d64, kw=0x0) at Python/ceval.c:3058
#38 0x40023ecb in sipEvalMethod (pm=0x8734788, args=0x81e2d64) at siplib.c:2898
#39 0x414a85a4 in sipQThread::sipVH_run(sipMethodCache const*, _sipThisType*) ()
from /usr/local/lib/python2.2/site-packages/libqtcmodule.so
#40 0x414a8553 in sipQThread::run() () from /usr/local/lib/python2.2/site-packages/libqtcmodule.so
#41 0x40517726 in QThreadPrivate::start(QThread*) (thread=0x8734778) at kernel/qthread_unix.cpp:79
---Type <return> to continue, or q <return> to quit---
#42 0x4051675b in start_thread (_arg=0x87327a0) at kernel/qthread_unix.cpp:98
#43 0x40031160 in pthread_start_thread () from /lib/libpthread.so.0
#44 0x40031262 in pthread_start_thread_event () from /lib/libpthread.so.0
So does anyone have any idea what's wrong or how to fix it? Please email me as well if you aren't posting to the PyQt list (kibab at icehouse dot net).
--Kaleb
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
With the help of some people on the PyQt/Python list, I figured it out.
I had my application being run directly in a file that was being imported. Since the import never completed (as my application started running) the import lock was held and when my thread tried to call import ... in the mysqldb module, it would deadlock. I ended up making a function to call instead of my code being executed immediately upon import. This solved the problem as the lock was no longer held.
--Kaleb
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Ok. I have a PyQt program using mysql as a database with mysqldb as my database client. I'm spawning qt threads to do all the work before I call a postevent to let my application know I'm done.
It turns out, however, that the thread locks in the middle of my run() call and never completes. I'm cross-posting this message as I'm not familiar with Python extension modules and I don't know if PyQt could have caused this, it is a Python bug (or feature) or if there is a problem in the mysqldb module code.
Here's my run call:
def run(self):
""" called after the thread is spawned """
try:
# never makes it through the quick_find_customer call....
self.data = quick_find.quick_find_customer(self.parameters)
print "quick find returned:",self.data
event = QCustomEvent(self.eventID)
event.setData(self.data)
QThread.postEvent(self.receiver,event)
except Exception, msg:
print msg
I traced through everything and it seems to be blocking in the mysql code:
def _execute(self, query, args):
# makes it into the function but ...
from types import ListType, TupleType
from sys import exc_info
# it never makes it this far....
try:
if args is None:
r = self._query(query)
Once it locks, I get the following backtrace (using a full debug build of Python/PyQt/etc.):
#0 0x4019fd49 in sigsuspend () from /lib/libc.so.6
#1 0x40033858 in __pthread_wait_for_restart_signal () from /lib/libpthread.so.0
#2 0x400300eb in pthread_cond_wait () from /lib/libpthread.so.0
#3 0x080b5c0e in PyThread_acquire_lock (lock=0x813d418, waitflag=1) at Python/thread_pthread.h:374
#4 0x080a5874 in lock_import () at Python/import.c:166
#5 0x080a81b2 in PyImport_ImportModuleEx (name=0x8182fc4 "types", globals=0x87f56a4, locals=0x8114484, fromlist=0x87f83f4)
at Python/import.c:1657
#6 0x080f617b in builtin___import__ (self=0x0, args=0x813ab0c) at Python/bltinmodule.c:40
#7 0x080f3ec6 in PyCFunction_Call (func=0x81379f0, arg=0x813ab0c, kw=0x0) at Objects/methodobject.c:79
#8 0x080cdd9b in PyObject_Call (func=0x81379f0, arg=0x813ab0c, kw=0x0) at Objects/abstract.c:1688
#9 0x0808ea7b in PyEval_CallObjectWithKeywords (func=0x81379f0, arg=0x813ab0c, kw=0x0) at Python/ceval.c:3058
#10 0x0808a3f8 in eval_frame (f=0x852f99c) at Python/ceval.c:1843
<snip>
#32 0x0808d204 in PyEval_EvalCodeEx (co=0x870c6b0, globals=0x871a6cc, locals=0x0, args=0x81e2d78, argcount=1, kws=0x0, kwcount=0,
defs=0x0, defcount=0, closure=0x0) at Python/ceval.c:2595
#33 0x080e30df in function_call (func=0x870f34c, arg=0x81e2d64, kw=0x0) at Objects/funcobject.c:374
#34 0x080cdd9b in PyObject_Call (func=0x870f34c, arg=0x81e2d64, kw=0x0) at Objects/abstract.c:1688
#35 0x080d6f80 in instancemethod_call (func=0x870f34c, arg=0x81e2d64, kw=0x0) at Objects/classobject.c:2292
#36 0x080cdd9b in PyObject_Call (func=0x8582af4, arg=0x81e2d64, kw=0x0) at Objects/abstract.c:1688
#37 0x0808ea7b in PyEval_CallObjectWithKeywords (func=0x8582af4, arg=0x81e2d64, kw=0x0) at Python/ceval.c:3058
#38 0x40023ecb in sipEvalMethod (pm=0x8734788, args=0x81e2d64) at siplib.c:2898
#39 0x414a85a4 in sipQThread::sipVH_run(sipMethodCache const*, _sipThisType*) ()
from /usr/local/lib/python2.2/site-packages/libqtcmodule.so
#40 0x414a8553 in sipQThread::run() () from /usr/local/lib/python2.2/site-packages/libqtcmodule.so
#41 0x40517726 in QThreadPrivate::start(QThread*) (thread=0x8734778) at kernel/qthread_unix.cpp:79
---Type <return> to continue, or q <return> to quit---
#42 0x4051675b in start_thread (_arg=0x87327a0) at kernel/qthread_unix.cpp:98
#43 0x40031160 in pthread_start_thread () from /lib/libpthread.so.0
#44 0x40031262 in pthread_start_thread_event () from /lib/libpthread.so.0
So does anyone have any idea what's wrong or how to fix it? Please email me as well if you aren't posting to the PyQt list (kibab at icehouse dot net).
--Kaleb
With the help of some people on the PyQt/Python list, I figured it out.
I had my application being run directly in a file that was being imported. Since the import never completed (as my application started running) the import lock was held and when my thread tried to call import ... in the mysqldb module, it would deadlock. I ended up making a function to call instead of my code being executed immediately upon import. This solved the problem as the lock was no longer held.
--Kaleb