多线程时无法连接服务器导致pymssql段错误

4 投票
1 回答
1503 浏览
提问于 2025-04-17 00:17

我们遇到了一个问题,当我们的 MS SQL 服务器无法连接时,导致了代码中的一个错误,让我们的程序彻底停摆,用户们当然是气急败坏,纷纷找上门来。我们把问题归结为这样一个情况:如果用户 Bob 尝试连接这个无法使用的数据库,他会在程序尝试连接时耐心等待。此时,如果第二个用户 Joe 也尝试连接,他同样会等待。过了一段时间,Bob 会因为超时而收到一个正确的错误提示。然而,Joe 的连接会超时,结果就会出现一个段错误(segmentation fault),让一切都停下来。

我们通过以下代码能够稳定地重现这个错误:

import threading
import datetime
import time
import pymssql

class ThreadClass(threading.Thread):
    def run(self):
        now = datetime.datetime.now()
        print "%s connecting at time: %s" % (self.getName(), now)
        conn = pymssql.connect(host="10.255.255.1", database='blah',
                               user="blah", password="pass")


for i in range(2):
    t = ThreadClass()
    t.start()
    time.sleep(1)

这个代码在第一个线程抛出错误后会导致段错误。有没有办法阻止这个段错误,让它正确地抛出一个错误,或者我是不是漏掉了什么?

使用的是 Pymssql 版本 1.0.2 和 Python 2.6.6。

1 个回答

2

我们也去pymssql的用户组问了这个问题,以确保我们考虑到了所有的情况。根据一位开发者的说法,目前稳定版本的pymssql并不是线程安全的。这意味着在多线程的情况下可能会出现问题。不过在开发中的1.9版本或者下一个主要的2.0版本中,可能会解决这个问题。我们可能会考虑换一个不同的模块,或者使用某种连接池的方式来解决这个问题,但这可能只是个临时的解决办法,并不是最理想的选择。

撰写回答