См. документы : threadsafety
есть, и я цитирую,
В настоящее время 2, что означает, что темы
может поделиться модулем и подключениями,
но не курсоры.
Таким образом, ваша конструкция «пул курсоров» (где один курсор может использоваться разными потоками), кажется, выходит за уровень threadsafety
. Это не проблема совместного использования соединений (это нормально, поскольку вы правильно указали threaded
в конструкторе соединения), а курсоры. Возможно, вы захотите сохранить каждый курсор в threading.local
после первого использования потока, чтобы каждый поток мог иметь свой собственный «пул» с 1 курсором (хотя это не ключевая оптимизация: создание нового курсора не является сверхмощная операция).
По вашему вопросу 2 предложение finally
выполняется, когда объект генератора (созданный с помощью вызова функции генератора Get
) полностью выполнен - либо потому, что он вызывает StopIteration
, либо потому, что он собирает мусор. (как правило, потому что последняя ссылка на него только что ушла). Например, если вызывающий абонент:
def imthecaller():
for i, row in enumerate(Get()):
print i, row
if i > 1: break
# this is the moment the generators' finally-clause runs
print 'bye'
finally
выполняется после того, как (максимум) 3 строки были yield
ed.