1

私はかなり初心者のプログラマーで、初めてマルチプロセッシングに手を入れています。通常の酸洗エラーに遭遇した後、ここで検索したところ、Pathos が使用するのに最適である可能性が高いことがわかりました。

アプリケーション全体の要点は、ssh を使用してサーバーのコレクションに接続し、データを引き出してデータベースに保存することです。それはうまく機能しますが、マルチプロセッシングを実行すると明らかに有益です。

元の関数呼び出しは次のようになります。

    devices = sq.sqlOperation("SELECT * from Devices")
    for device in devices:
            pullNewData(device) 

要するに、SQL クエリは辞書のリストを提供し、pullNewData() に各レコードの辞書をフィードし、接続し、すべてをプルし、データベースを更新します。

数千行のコードを書き直したくないので、簡単に適応できることを願っています。次の例はすべて次のとおりです。

from pathos.multiprocessing import ProcessingPool as Pool

頂点で。私はもう試した:

    devices = sq.sqlOperation("SELECT * from Devices")
    p = Pool(4)
    p.apipe(pullNewData, devices) 

try/except で丸めたとしても、静かに失敗しました

    devices = sq.sqlOperation("SELECT * from Devices")
    p = Pool(4)
    p.map(pullNewData, devices) 

同じ、サイレント失敗:

でも:

    devices = sq.sqlOperation("SELECT * from Devices")
    p = Pool(4)
    for data in devices:
        p.apipe(pullNewData(data))

動作しましたが、それぞれを順番に実行しただけです。

必死になって、それをリスト内包表記の中に入れようとさえしました(はい、これは恐ろしく醜いですが、その時点で私は何でもしたでしょう)

    devices = sq.sqlOperation("SELECT * from Devices")
    p = Pool(4)
    [ p.apipe(pullNewData(data)) for data in devices ]

それで、どうすればこれを行うことができますか?各レコードの新しい接続を並行して起動するにはどうすればよいですか?

4

1 に答える 1

1

それで、試してみるとPool(1)、どのような問題が発生しているかがわかりました。このファイルと他のファイルの両方で他の関数を呼び出していましたが、関数はまったく新しいプロセスであるため、まったく知らなかったので、他のモジュールの両方に import ステートメントを配置し、

from thisModule import thisFunction

同じファイル内の他の関数用。その後、プールをアップしたところ、以下を使用して完全に機能しました。

devices = sq.sqlOperation("SELECT * from Devices")
p = Pool(4)
p.map(pullNewData, devices)

ありがとう、これは私にとって非常に役に立ち、とても勉強になりました。

新しいプロセスが、関数が存在するファイル内の import ステートメントや他の関数を認識しないことは、私にはわかりませんでした。しかたがない。私を正しい方向に向けてくれたthebjornに感謝します。

于 2016-07-29T12:04:31.183 に答える