2

我之前实际上已经问过一个关于多处理的问题,但现在我遇到了一个奇怪的缺点,即返回的数据类型。

我正在使用 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 对象特别且“不可腌制”?

提前谢谢大家。

4

2 回答 2

0

多处理使用酸洗在进程之间传递对象。所以我不相信你可以使用多处理并使对象变得不可拾取。

于 2015-07-31T00:51:09.327 回答
0

我最终通过让子流程在其内部执行必要的工作而不是返回 Worksheet 对象来解决这个缺点。

我最终得到的是大约六个函数和多处理函数对,每一个都是为了完成我需要做的事情而编写的,但是在一个子进程内部,以便可以对其进行监控和计时。

分层地图看起来像:

Main()
    check_spreadsheet_for_a_string()
        check_spreadsheet_for_a_string_worker()
    get_hash_of_spreadsheet()
        get_hash_of_spreadsheet_worker()

... ETC

其中“worker”函数是在多处理设置中调用的函数,它们上面的常规函数​​管理子进程并对其计时,以确保如果对 gspread 内部的调用挂起或花费太长时间,整个程序不会停止.

于 2016-02-29T21:12:49.160 回答