我正在编写多线程python应用程序。
主线程创建一个5个工作线程的线程池。 主线程还创建了一个Monitor Thread。
总计:6个主题+ 1个主要主题= 7
All Threads与MySQL服务器通话(mysqldb - > libmysqlclient_r)
在我的SQL包装器中,我在数据库查询功能中添加了Threading.Lock。 此锁定是全局锁定,查询数据库的所有线程都使用它。
def query(self, query):
with lock:
execute Query Here
一切正常,直到某个时候,主线程卡住了(所有线程都是如此) 我附加了GDB调试器并注意到:(信息线程)
7 Thread 0x7f555c386700 (LWP 16077) 0x00007f5561a503c0 in sem_wait () from /lib/libpthread.so.0
6 Thread 0x7f555bb85700 (LWP 16078) 0x00007f5561a503c0 in sem_wait () from /lib/libpthread.so.0
5 Thread 0x7f555b384700 (LWP 16079) 0x00007f5561a503c0 in sem_wait () from /lib/libpthread.so.0
4 Thread 0x7f555ab83700 (LWP 16080) 0x00007f5561a503c0 in sem_wait () from /lib/libpthread.so.0
3 Thread 0x7f555a382700 (LWP 16081) 0x00007f5561a503c0 in sem_wait () from /lib/libpthread.so.0
2 Thread 0x7f5559b81700 (LWP 16083) 0x00007f55609141a3 in select () from /lib/libc.so.6
1 Thread 0x7f5561e6f700 (LWP 16061) 0x00007f5561a503c0 in sem_wait () from /lib/libpthread.so.0
Th1 =主线程,Th2 =监控线程,Th3-Th7 - 工作线程
我注意到监视器线程旁边的所有线程都在等待sem_wait():
(gdb) bt
#0 0x00007f5561a503c0 in **sem_wait** () from /lib/libpthread.so.0
#1 0x00000000004d44e8 in **PyThread_acquire_lock** ()
#2 0x00000000004d8982 in ?? ()
#3 0x00000000004a7ba5 in PyEval_EvalFrameEx ()
然而,监视器线程能够获取和释放锁定(它每30秒运行一次,你看到的select()是由于睡眠(30))。 我不明白,为什么剩下的线程都停留在sem_wait()上,因为没有人获得锁。
任何想法如何解决这个问题?如何调试?
谢谢
答案 0 :(得分:0)
似乎我使用多个线程使用相同的连接,不允许使用DOCS。
提示:确保每个Thread都有自己的Connection对象。