Самый быстрый способ для python запросов + mysql + многопроцессорность - PullRequest
1 голос
/ 09 февраля 2020

Мне нужно запустить скрипт, который использует запросы и отправлять данные в mysql базу данных

, сейчас я использую multiprocessing.dummy и ThreadPool. Пример кода:

pool = ThreadPool(10)

def run(l):
    #few lines of code, there is no need to paste everything

    #get last id from mysql table
    find_id = "SELECT * FROM Items ORDER BY id DESC LIMIT 0, 1"
    mycursor.execute(find_id)

    #I'm making request and then need to send data to mysql db
    data = requests.get(...).text
    ...
    mydb.commit()


results = pool.map(run, urls)

Все было бы замечательно, но я чувствую, что скрипт не такой быстрый, как должен быть с 10 потоками (он почти такой же медленный, как один поток). Я проверил идентификатор процесса с помощью:

os.getpid()

и каждый поток имеет одинаковый идентификатор. В любом случае, самая большая проблема заключается в том, что через некоторое время, может быть, 10-20 минут, скрипт становится все медленнее и медленнее, пока один поток не остановится в середине функции, и все не остановится навсегда.

Я также пробовал многопроцессорную обработку. Процесс с очередями, но это не сработало, как я хочу. Каждый поток / процесс использовал одну и ту же последнюю строку из таблицы mysql (проверьте мою переменную find_id в приведенном выше коде), и процессы / потоки подключались к базе данных в то же время, что и ее блокировка ...

Раньше я использовал многопроцессорность для простых запросов, и все отлично работало даже для большего количества потоков, поэтому я думаю, что есть проблема с python многопроцессорностью и mysql фиксацией одновременно.

ВОПРОС:

Есть ли какой-нибудь эффективный способ, который мог бы работать для меня? Запросы + mysql фиксирует, и все выполняется одновременно с несколькими рабочими / потоками / процессами.

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