Мне нужно запустить скрипт, который использует запросы и отправлять данные в 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 фиксирует, и все выполняется одновременно с несколькими рабочими / потоками / процессами.