Возможно, вы могли бы использовать состояние курсора, чтобы сказать вам, используется ли курсор. Допустим, у вас был следующий курсор:
new_cursor = new_connection.cursor()
cursor.execute(new_query)
, и вы хотели посмотреть, доступно ли это соединение для использования другим курсором. Вы могли бы быть в состоянии сделать что-то вроде:
if (new_cursor.rowcount == -1):
another_new_cursor = new_connection.cursor()
...
Конечно, все это действительно говорит вам о том, что курсор еще ничего не выполнил с момента последнего закрытия. Он может указывать на выполненный курсор (и, следовательно, на соединение, которое было закрыто), или он может указывать на курсор, который был только что создан или присоединен к соединению. Другой вариант - использовать цикл try / catch, что-то вроде:
try:
another_new_cursor = new_connection.cursor()
except ConnectionError?: //not actually sure which error would go here but you get the idea.
print("this connection is busy.")
Конечно, вы, вероятно, не хотите получать спам с печатными сообщениями, но вы можете делать что угодно в этом кроме блокировки, ожидания в течение 5 секунд, ожидания передачи другой переменной, ожидания ввода пользователя и т. д. Если вы ограничены PEP 249, вам придется многое делать с нуля. Есть ли причина, по которой вы не можете использовать внешние библиотеки?
РЕДАКТИРОВАТЬ: Если вы хотите выйти за пределы PEP 249, вот кое-что, что может работать, но это может не подходить для ваших целей. Если вы используете библиотеку Python mysql
, вы можете воспользоваться методом is_connected
.
new_connection = mysql.connector.connect(host='myhost',
database='myDB',
user='me',
password='myPassword')
...stuff happens...
if (new_connection.is_connected()):
pass
else:
another_new_cursor = new_connection.cursor()
...
Я думаю что все больше std::string
реализации переедут от refcounting/copy-on-write, поскольку это часто - противооптимизация в многопоточном коде.
См. статью Optimizations That Are Herb Sutter не (В Многопоточном Мире).
Фактический STL требует что при использовании подсчета ссылок, что семантика совпадает с для не ссылки считаемой версией. Это не тривиально для общего случая. (Который является, почему Вы не должны писать Ваш на строковом классе).
Из-за следующей ситуации:
std::string x("This is a string");
char& x5 = x[5];
std::string y(x);
x5 = '*';
См.: http://www.sgi.com/tech/stl/string_discussion.html для получения дополнительной информации
Возможно, Microsoft решила, что строка, копирующая, не была большой проблемой как почти вся передача использования кода C++ ссылкой по мере возможности. Поддержание подсчета ссылок имеет издержки в пространстве и времени (игнорирующий блокирующий), что, возможно, они решили, не стоило платить.
Или возможно нет. Если это вызывает беспокойство для Вас, необходимо представить приложение, чтобы определить, является ли строка, копирующая, главными издержками, и если это - переключатель к другой строковой реализации.
Как указано Martin & Michael, Копия на записи (COW) часто является большей проблемой, чем это стоит, поскольку дополнительные материалы для чтения видят эту превосходную статью Kelvin Henney о Коровьем бешенстве, и я полагаю, что это был Andrei Alexandrescu, который заявил, что Маленькая Строковая Оптимизация работает лучше во многих приложениях (но я не могу найти статью).
Маленькая Строковая Оптимизация состоит в том, где Вы заставляете строку возразить больше и избежать выделений "кучи" для маленьких строк. Игрушечная реализация будет выглядеть примерно так:
class string {
char *begin_, *end_, *capacity_;
char buff_[64]; // pick optimal size (or template argument)
public:
string(const char* str)
{
size_t len = strlen(str);
if (len < sizeof(buff_))
{
strcpy(buff_, str);
begin_ = buff_;
capacity_ = buff_ + sizeof(buff_);
}
else
{
begin_ = strdup(str);
capacity_ = begin_ + len;
}
end_ = begin_+len;
}
~string()
{
if (begin_ != buff_)
free(begin_); // strdup requires free
}
// ...
};
Это не главная причина, но я видел много неправильного кода под win32 платформой, которое делает что-то как const_cast< char* >( str.c_str() )
.
Возможно, Microsoft знает это, и заботится о разработчиках :)