具有多处理抛出类型错误的pymysql
pymysql with multiprocessing throw typeerror
我使用了 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.
- 为什么会出现以上错误?
谢谢。
由于 multiprocessing
将多个进程启动到 运行 您的代码,它会尝试序列化数据以从父进程传输到子进程。当它尝试序列化 self.connection
- 这是 pymysql.connection
对象时,可能会出现错误。
最简单的解决方法是在每个进程中使用不同的连接。只要您可以控制启动的进程数,就应该没问题。
我使用了 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.
- 为什么会出现以上错误?
谢谢。
由于 multiprocessing
将多个进程启动到 运行 您的代码,它会尝试序列化数据以从父进程传输到子进程。当它尝试序列化 self.connection
- 这是 pymysql.connection
对象时,可能会出现错误。
最简单的解决方法是在每个进程中使用不同的连接。只要您可以控制启动的进程数,就应该没问题。