pymysql с многопроцессорным броском - PullRequest
0 голосов
/ 08 мая 2019

Я использовал pymysql и многопроцессорность.

Пожалуйста, обратитесь ниже код.

import os
from multiprocessing import Pool
import pymysql


class Test:
    def __init__(self):
        self.connection = pymysql.connect(host='host',
                             user='use',
                             password='pwd',
                             db='db',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

    def print(self, args):
        print("[Pid:{}] {}".format(os.getpid(), args))
        return args

    def run(self):
        with Pool(processes=4) as p:
            print(p.map(self.print, [1,2]))


if __name__ == '__main__':
    test = Test()
    test.run()

Я определил соединение mysql в __init__ для его повторного использования.

Но когда я его выполняю, выдают ошибки.

TypeError: cannot serialize '_io.BufferedReader' object

Question1.

  • Если вы используете pymysql с многопроцессорной обработкой, следует ли мне создавать мульти-соединение и использовать его вместо повторного использования одного соединения?

Вопрос2.

  • Почему выше произошла ошибка?

Спасибо.

1 Ответ

2 голосов
/ 08 мая 2019

Поскольку multiprocessing запускает ваш код несколькими процессами, он пытается сериализовать данные для передачи из родительского процесса в дочерние. Ошибка, вероятно, появляется, когда он пытается сериализовать self.connection - который является pymysql.connection объектом.

Самое простое решение - использовать разные соединения в каждом процессе. Пока у вас есть контроль над количеством запускаемых процессов, все должно быть в порядке.

...