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

Worksheet オブジェクトを返すのではなく、サブプロセスが内部で必要な作業を実行するようにすることで、この欠点を回避するソリューションを作成することになりました。

私が最終的に得たのは、約半ダースの関数とマルチプロセッシング関数のペアで、それぞれが必要なことを実行するように記述されていましたが、監視とタイミングが取れるようにサブプロセス内にありました。

階層マップは次のようになります。

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

...など

「ワーカー」関数はマルチプロセッシングのセットアップで呼び出される関数であり、その上の通常の関数はサブプロセスを管理し、gspread 内部の呼び出しがハングしたり時間がかかりすぎたりした場合にプログラム全体が停止しないように時間をかけます。 .

于 2016-02-29T21:12:49.160 に答える
0

マルチプロセッシングは、ピクルを使用してプロセス間でオブジェクトを渡します。したがって、マルチプロセッシングを使用してオブジェクトをピクル化できないようにできるとは思いません。

于 2015-07-31T00:51:09.327 に答える