Сельдерей и SQLAlchemy - этот объект результата не возвращает строки. Было закрыто автоматически

У меня есть проект сельдерея, связанный с базами данных MySQL. Одна из таблиц определяется так:

class MyQueues(Base):
    __tablename__ = 'accepted_queues'

    id = sa.Column(sa.Integer, primary_key=True)
    customer = sa.Column(sa.String(length=50), nullable=False)
    accepted = sa.Column(sa.Boolean, default=True, nullable=False)
    denied = sa.Column(sa.Boolean, default=True, nullable=False)

Также в настройках у меня

THREADS = 4

И я застрял в функции:code.py

def load_accepted_queues(session, mode=None):

    #make query  
    pool = session.query(MyQueues.customer, MyQueues.accepted, MyQueues.denied)

    #filter conditions    
    if (mode == 'XXX'):
        pool = pool.filter_by(accepted=1)
    elif (mode == 'YYY'):
        pool = pool.filter_by(denied=1)
    elif (mode is None):
        pool = pool.filter(\
            sa.or_(MyQueues.accepted == 1, MyQueues.denied == 1)
            )

   #generate a dictionary with data
   for i in pool: #

Ответы на вопрос(1)

Решение Вопроса

да. ты абсолютноне могу используйте Session (или любые объекты, которые связаны с этим Session) или Connection, в более чем одном потоке одновременно, особенно с MySQL-Python, чьи DBAPI-соединения очень небезопасны *. Вы должны организовать свое приложение так, чтобы каждый поток занимался этим ».Собственное выделенное соединение MySQL-Python (и, следовательно, SQLAlchemy Connection / Session / объекты, связанные с этим сеансом) без утечки в какой-либо другой поток.

Изменить: в качестве альтернативы, вы можете использовать мьютексы, чтобы ограничить доступ к соединению Session / Connection / DBAPI только одним из этих потоков одновременно, хотя это не так часто, потому что необходимая высокая степень блокировки имеет тенденцию разрушать цель использования несколько потоков в первую очередь.
 Ryan Chou04 нояб. 2017 г., 03:32
@zzzeek Отлично, яЯ так благодарен за резюме. Это могло бы дать мне ясно понять мою проблему. Хотя мне интересно, не могли бы вы предоставить удобный для человека интерфейс для решения этой проблемы. все больше и большеmulti-processes  такие случаи Было бы более полезно использовать sqlalchemy.
 Ryan Chou03 нояб. 2017 г., 17:07
@zzzeek Я встречался с той же проблемой, что и колба-sqlalchemy, сотрудничающая с колбой-rq. который поднял исключение какResourceClosedError: This result object does not return rows. It has been closed automatically. в RQ Worker. Я просто последовал примеру колбы с помощьюwith app.context()  поделиться с сессией для рабочего вызова асинхронной задачи с моделями. Интересно, есть ли хорошие предложения для случаев?
 zzzeek03 нояб. 2017 г., 23:14
это большая предметная область, и пока я могуне могу прокомментировать, как установить колбу или сельдерей, яМы попытались обобщить текущие известные сценарии для этого здесь:docs.sqlalchemy.org/en/latest/faq/...
 fedorqui01 июл. 2013 г., 10:56
Отлично. Я должен улучшить код, который мне дали, поэтому, чтобы следовать вашим ценным советам, мне действительно нужно больше знаний о потоках и сессиях. Я искал всестороннюю и с нуля документацию уровня и нашелdocs.sqlalchemy.org/en/rel_0_8/orm/session.html , Поскольку вы знаете эту тему больше, чем кто-либо, не могли бы вы предложить любую другую возможную отправную точку? Большое спасибо, @zzzeek!
 zzzeek02 июл. 2013 г., 01:58
словарь из запроса лучше всего выглядит так: dict (session.query (Foo.x, Foo))
 fedorqui01 июл. 2013 г., 11:04
Кстати (извините), что лучше, использоватьpool.all() или жеpool создать словарь по результатам запроса? (последняя часть моего оригинального вопроса)
 fedorqui28 июн. 2013 г., 11:01
Хм, так что это проблема с потоками и параллелизмом ... Это открывает широкий спектр возможностей, я не уверен, что знаю, как справиться. Есть ли какой-то конкретный способ работать с одним потоком одновременно? Как я могу отследить, какой поток что делает? Любой намек будет высоко оценен!
 zzzeek28 июн. 2013 г., 21:09
Если ты'Если вы собираетесь использовать потоки, то вам нужно овладеть одним или обоими из двух основных приемов - заставить каждый поток вообще не разделять состояние или использовать мьютексы / блокировки вокруг общих не поточно-безопасных ресурсов, чтобы только один нить за раз прикасается к нему. С SQLAclhemy, "дон»ничего не делюсь случай использования обычно решается с помощьюscoped_session построить. Но это'очень полезно, если у вас есть твердое понимание того, что "локальная переменная потока и что это значит.

Ваш ответ на вопрос