Segfault с pymssql, когда не удается подключиться к серверу в нескольких потоках - PullRequest
3 голосов
/ 25 августа 2011

Мы столкнулись с этим, когда наш сервер MS SQL стал недоступным.Это вызвало ошибку в нашем коде, которая привела к полной остановке нашей программы и, конечно, к нашим дверям вилы и факелы пользователей.Мы смогли свести нашу проблему к следующему: если пользователь, Боб, попытается подключиться к отключенной базе данных, он, конечно, будет ждать, пока программа попытается подключиться.Если в этот момент, пока Боб ждет, второй пользователь, Джо, попытается подключиться, и он тоже будет ждать.Через некоторое время у Боба истечет время ожидания, и появится правильная ошибка.Однако соединение Джо истекает, и возникает ошибка сегментации, приводя к полной остановке.

Мы смогли надежно воспроизвести эту ошибку с помощью следующего кода

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)

Это приведет кsegfault после первого потока поднимает свою ошибку.Есть ли способ остановить этот segfault, заставить его правильно вызвать ошибку, или я что-то упускаю здесь?

Pymssql версии 1.0.2 и python 2.6.6.

1 Ответ

2 голосов
/ 25 августа 2011

Мы пошли и задали вопрос в группе пользователей pymssql, чтобы охватить все наши базы. По словам одного из разработчиков pymssql не является потокобезопасным в текущей стабильной версии. Похоже, что это может быть в разработке версии 1.9 или в следующем основном выпуске 2.0. Мы, вероятно, переключимся на другой модуль или, возможно, воспользуемся каким-либо пулером соединений с ним, но это, скорее, исправление бинта и не совсем идеально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...