带有多处理的pymysql抛出TypeError

时间:2019-05-08 05:01:32

标签: python python-multiprocessing pymysql

我用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()

我在__init__中定义了mysql连接以重用它。

但是当我执行它时,会抛出错误。

TypeError: cannot serialize '_io.BufferedReader' object

问题1。

  • 如果在多处理中使用pymysql,我应该创建多连接并使用它而不是重用一个连接吗?

问题2。

  • 为什么会发生上述错误?

谢谢。

1 个答案:

答案 0 :(得分:2)

由于multiprocessing启动了多个进程来运行您的代码,因此它将尝试序列化数据以从父进程传输到子进程。尝试序列化self.connection对象pymysql.connection时,可能会出现错误。

最简单的解决方法是在每个进程中使用不同的连接。只要您可以控制正在启动的进程数,就可以了。