我之前实际上已经问过一个关于多处理的问题,但现在我遇到了一个奇怪的缺点,即返回的数据类型。
我正在使用 Gspread 与 Google 的 Sheets API 交互并获取“工作表”对象。
这个对象,或者这个对象的一个方面,由于是“unpickle-able”,显然与多处理不兼容。请看输出:
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 554, in get
raise self._value
multiprocessing.pool.MaybeEncodingError: Error sending result: '[<Worksheet 'Activation Log' id:o12345wm>]'.
Reason: 'UnpickleableError(<ssl.SSLContext object at 0x1e4be30>,)'
我使用的代码本质上是:
from multiprocessing import pool
from oauth2client.client import SignedJwtAssertionCredentials
import gspread
sheet = 1
pool = multiprocessing.pool.Pool(1)
p = pool.apply_async(get_a_worksheet, args=(sheet,))
worksheet = p.get()
并且脚本在尝试“获取”结果时失败。get_a_worksheet 函数返回一个允许我操作远程工作表的 Gspread 工作表对象。能够上传对文档的更改在这里很重要——我不只是尝试引用数据,我还需要更改它。
有谁知道我如何在单独且可监控的线程中运行子进程,并在最后安全地从中获取任意(或自定义)对象类型?有谁知道是什么让 ssl.SSLContext 对象特别且“不可腌制”?
提前谢谢大家。