以前にマルチプロセッシングについて実際に質問したことがありますが、返されるデータのタイプに関する奇妙な欠点に直面しています。
私は 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 オブジェクトが特別で「ピクルできない」理由を知っている人はいますか?
よろしくお願いします。