多处理 - 返回不可解决的对象?

时间:2015-07-30 23:56:51

标签: python multiprocessing gspread

我实际上已经问过a question about multiprocessing before,但现在我遇到了一个奇怪的缺点,即返回的数据类型。

我正在使用Gspread与Google的Sheets API进行交互,并获得一个"工作表"反对。

此对象或此对象的一个​​方面显然与多处理不兼容,因为它是“不可用的”#34;。请参阅输出:

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

脚本在尝试&#34;得到&#34;时失败了。结果。 get_a_worksheet函数返回一个Gspread工作表对象,允许我操作远程工作表。能够在文档中上传更改非常重要 - 我不仅要尝试引用数据,还需要对其进行更改。

有谁知道如何在一个单独的可监视线程中运行子进程,并在最后安全地获取一个任意(或自定义)对象类型?有没有人知道是什么让ssl.SSLContext对象变得特别和&#34;不可解决的&#34;?

提前全部谢谢。

2 个答案:

答案 0 :(得分:0)

多处理使用酸洗在进程之间传递对象。所以我不相信你可以使用多处理并使对象无法打开。

答案 1 :(得分:0)

我最终围绕这个缺点编写了一个解决方案,让子流程只是在自身内部执行必要的工作,而不是返回一个Worksheet对象。

我最终得到的是大约六个函数和多处理函数对,每个函数对都是为了做我需要做的事情,但是在子进程内部,以便可以监视和定时。

分层图看起来像:

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

...等

&#34;工人&#34;函数是在多处理设置中调用的函数,它们上面的常规函数​​管理子进程并为其确定时间,以确保如果对gspread内部的调用挂起或耗时太长,整个程序不会停止。