Запуск нескольких методов экземпляра класса параллельно с существующим сеансом - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь выполнить действие несколько раз параллельно, используя пул многопроцессорной обработки, но получаю PicklingError.

Код выглядит следующим образом:

from multiprocessing import Pool, cpu_count
pool = Pool(processes=cpu_count())
processes = [pool.apply_async(self.some_func, kwds=some_kwargs) for item in list]
results = [process.get() for process in processes]

Функция, которую я запускаю, действительно является методом экземпляра класса, и мне нужно подключение к сеансу, пока этот процесс выполняется.

Последняя строка (в частности, process.get ()) дает мне PicklingError:

_pickle.PicklingError: Can't pickle <class 'sqlalchemy.orm.session.Session'>: it's not the same object as sqlalchemy.orm.session.Session

Я пытался некоторое время искать, пробовал async await, asyncio и ThreadPool.

Мне нужно, чтобы этот метод запускался несколько раз параллельно (для экономии времени) и получаювозвращаемое значение обратно.

PS: я не могу показать реальный код, потому что это часть рабочего проекта, которым мне не разрешено делиться, но если это поможет, скажем, self.some_func выглядит следующим образом:

class MyClass():
    def __init__(self):
        ....

    def __initapp__(app, db):
        self._db_session = db.session
        ... more settings

    def some_func(x, y, z):
        do something with x, y and z
        persist something to the database

Любая помощь будет принята с благодарностью!

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