多线程时无法连接服务器导致pymssql段错误
我们遇到了一个问题,当我们的 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版本中,可能会解决这个问题。我们可能会考虑换一个不同的模块,或者使用某种连接池的方式来解决这个问题,但这可能只是个临时的解决办法,并不是最理想的选择。