【发布时间】:2018-10-22 00:00:30
【问题描述】:
我有一些连接到 postgres 的多处理代码。核心逻辑不是很复杂:
manager = Manager()
managedwork = manager.list(thelist)
connections = {i: setconnection() for i in range(workercount)}
jobs = [Process(target=managedworker, args=(managedwork, connections[i])) for i in range(workercount)]
setconnection() 返回一个内部有 psycopg2 连接的对象。界面不是很有趣:c = setconnection() + c.dbconnection 会给你你认为你可能得到的东西。在我们定义了作业之后,以下会产生问题:
for j in jobs:
j.start()
for j in jobs:
j.join()
start() 在 Windows10 上使用 python37 引发异常:TypeError: can't pickle psycopg2.extensions.connection objects。被冒犯的一方是ForkingPickler。
同样的代码在安装了python37 的 macOS、FreeBSD 和 Linux 上也能正常工作。 psycopg 2.7.5 也部署在所有四个平台上。我很想知道可能需要什么样的修复来解决这个问题。我根本不习惯 Windows,所以对于其他人来说可能很明显为什么会发生这种情况。
感谢您的关注和帮助。
【问题讨论】:
标签: python-3.x multiprocessing cross-platform pickle psycopg2