【问题标题】:PyThread_acquire_lock - issues with Acquiring a KeyPyThread_acquire_lock - 获取密钥的问题
【发布时间】:2012-05-29 00:50:35
【问题描述】:

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

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

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

所有线程都与 MySQL 服务器对话 (mysqldb -> libmysqlclient_r)

在我的 SQL 包装器中,我向 DB 查询函数添加了一个 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() 上,因为没有人获得锁。

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

谢谢

【问题讨论】:

    标签: python multithreading thread-safety python-multithreading pydbg


    【解决方案1】:

    似乎我使用多个线程使用相同的连接,这是 DOCS 不允许的。

    提示:确保每个 Thread 都有自己的 Connection 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      • 2020-12-14
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2021-04-18
      相关资源
      最近更新 更多