Как передать ядро ​​базы данных / соединение в многопроцессорный пул? не могу засечь объекты _thread._local - PullRequest
0 голосов
/ 27 февраля 2020

Я хочу эффективно выполнить sql на task. Но я не знаю как! В настоящее время я вызываю немую функцию из task, которая создает соединение с with snowflake.connector.connect(some_creds_here) as con:, создает соединение для каждого запроса .

Я попытался отправить объект механизма на task но у него был тот же ответ. Я создал эту базовую c структуру из большого модуля для отладки.

def get_connection():
    engine = create_engine(
        'snowflake://{user}:{password}@{account}/'.format(
            user="user",
            password="password",
            account="us-east-1",
        )
    )
    try:
        connection = engine.connect()
        return connection, engine
    finally:
        pass

def task(con):
    con = con.connect()
    print(con.execute('select current_version()').fetchone())

def main():
    connection, engine = get_connection()
    iterable = [(engine) for x in range(10)]
    with Pool() as p:
        for _ in p.imap_unordered(task, iterable):
            ...
    con.close()
    engine.dispose()

if __name__ == "__main__":
    main()

Вот ответ об ошибке:

Traceback (most recent call last):
  File "service\ECR\file_conversion_worker\mock.py", line 26, in main
    for _ in p.imap_unordered(task, iterable):
  File "\AppData\Continuum\lib\multiprocessing\pool.py", line 748, in next
    raise value
  File "\AppData\Continuum\lib\multiprocessing\pool.py", line 431, in _handle_tasks
    put(task)
  File "\AppData\Continuum\lib\multiprocessing\connection.py", line 206, in send
    self._send_bytes(_ForkingPickler.dumps(obj))
  File "\AppData\Continuum\lib\multiprocessing\reduction.py", line 51, in dumps
    cls(buf, protocol).dump(obj)
TypeError: can't pickle _thread._local objects

Редактировать: исправленный пул потоков в многопроцессорный пул

...