我实际上已经问过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;?
提前全部谢谢。
答案 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内部的调用挂起或耗时太长,整个程序不会停止。