Как обрабатывать многопроцессорные запросы на Windows с Python - PullRequest
0 голосов
/ 17 июня 2019

Я пытался бороться с медленным временем чтения с помощью некоторого моста python-java для доступа к базам данных.Я пытаюсь реализовать многопроцессорный способ получения данных.

Я использую модуль multiprocessing (я не могу заставить pathos работать с окнами).

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

queries = ["SELECT * FROM ... WHERE condition1",
           "SELECT * FROM ... WHERE condition2",
           ... ]

У меня есть объект подключения, который позволяет мне создавать столько курсоров, сколько необходимо (разные курсоры могут работать параллельно):

conn = <connectionObject>

curs1 = conn.cursor()
curs1.execute( queries[0] )
arr1 = curs1.fetchall() # retrieves the data from the query

curs2 = conn.cursor()
curs2.execute( queries[1] )
arr2 = curs2.fetchall()

curs1.close()
curs2.close()
conn.close()

Я пытаюсь создать пул рабочих, которые будут работать над запросами (один запрос = одна задача).Функция, которую я вызываю, должна быть в другом скрипте (чтобы избежать бесконечного цикла в блокноте Jupyter).Основной сценарий выглядит следующим образом:

if __name__ ==  '__main__':
    p = multiprocessing.Pool(processes = multiprocessing.cpu_count() )

    for query in queries:
        curs = conn.cursor()
        output = p.apply(otherScript.retrieveData, args = (query, curs,) )
        curs.close()

Функция retrieveData в otherScript.py выглядит следующим образом:

def retrieveData(query, curs):
    curs.execute(query)
    return curs.fetchall()

И я получаю эту ошибку при применении:

Can't pickle <class 'class that has to do with the cursor database driver'>

Из того, что я понял, pickle не может работать с классами, и ошибки исчезают, когда я убираю курсор из своих аргументов.

Как я могу решить эту проблему?Я не понимаю, зачем нужен pickle (список должен быть выбираемым, даже список объектов, верно?).На самом деле, я не очень понимаю, как это должно работать и как я должен структурировать это, у меня были проблемы с поиском базовых примеров, хотя я читал об этом с прошлой недели.

Среда:

  • Python 3.7 через Jupyter Notebook
  • Windows 7
  • библиотека подключений jaydebeapi (jav-мост JDBC с драйвером java-архивов)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...