2011-08-24 57 views
3

当我们的MS SQL服务器无法访问时,我们遇到了这个问题。这导致了我们的代码中的一个错误,它使得我们的程序停下来,当然还有干扰用户和我们门口的火把。我们已经能够解决我们的问题:如果用户Bob试图连接到数据库,他当然会等待程序尝试连接。如果此时Bob正在等待,另一个用户Joe尝试连接,他也会等待。过了一会,鲍勃会超时,并获得适当的错误。但是,乔的连接将会超时,并发生分段错误,导致所有内容都处于暂停状态。Segfault与pymssql无法连接到多线程服务器

我们已经能够可靠地重现此错误与下面的代码

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。

回答

2

我们去了pymssql用户组,询问了这个问题,以覆盖我们所有的基础。 According to one of the developers在当前的稳定版本中,pymssql不是线程安全的。这听起来像它可能在开发1.9版本或下一个主要的2.0版本。我们可能会切换到一个不同的模块,或者可能使用某种连接池,但这可能更像是一种绷带修复,并不是很理想。