繁体   English   中英

PyThread_acquire_lock-获取密钥的问题

[英]PyThread_acquire_lock - issues with Acquiring a Key

我正在编写多线程python应用程序。

主线程创建一个由5个工作线程组成的线程池。 主线程还创建一个监视线程。

总计:6个线程+ 1个主线程= 7

所有线程都与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()是由于sleep(30)造成的)。 我不明白,为什么其余线程都停留在sem_wait()上,因为没有人获得该锁。

任何想法如何解决这个问题? 如何调试呢?

谢谢

似乎我正在使用具有多个线程的同一连接,DOCS不允许这样做。

提示:确保每个线程都有自己的连接对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM