2016-11-27 21 views
0

ラズベリー・ピー3(4コア)上で稼働する株価機械学習アプリケーションでマルチプロセッシングを使用しようとしています。Python Concurrent ProcessPoolExecutorがRaspberry Pi(アイドルPython 3.4.2)で動作しません

from concurrent import futures 

def some_function(x): 
    return x + 1 

def main_function(some_list): 
    with futures.ProcessPoolExecutor() as executor: 
     results = executor.map(some_function, some_list) 
    return results 

if __name__ == '__main__': 
    print(main_function([1, 2, 3])) 

私はこれを実行すると、私はすぐにプロセスがまだ実行されている、と私はそれを殺すためにかどうかを確認されたというメッセージが出ます:ここでの問題を示しているいくつかのコードがあります。 「OK」を押すかどうかに関係なく、プログラムは結果やエラーを生成しません。

ProcessPoolExecutorをThreadPoolExecutorに変更すると問題が解決され、プログラムはジェネレータオブジェクトを期待どおりに配信します。

答えて

0

あなたは次のようにあなたのロジックを修正する必要があります。

from concurrent import futures 

def some_function(x): 
    return x + 1 

def main_function(some_list): 
    with futures.ProcessPoolExecutor() as executor: 
     results = executor.map(some_function, some_list) 

    return list(results) 

if __name__ == '__main__': 
    print(main_function([1, 2, 3])) 

ProcessPoolExecutor.mapは、結果を取得するために消費される必要がある発電機を返します。上記のロジックは繰り返し処理されません。ジェネレータオブジェクトは何も印刷されません。

+0

多くのお客様に感謝します。私はそれがジェネレータオブジェクトを返すことを理解し、ThreadPoolExecutorもジェネレータを返します。しかし、問題は返される値ではなく、ThreadPoolExecutorがジェネレータ(またはあなたの編集ではリスト)を返すのに対し、ProcessPoolExecutorは何も返しません(提案された編集でも)。私は今、それがアイドルのバグであると信じています - スクリプトは端末で正しく動作します。 – pythonbutcher

+0

私の修正では、スクリプトはあらかじめジェネレータを印刷していた端末で正しく動作します。ブラインドの推測:with文の中の 'return list(results)'行をインデントしてみてください。それは役に立ちますか?ここでの問題の1つは、with文がコールをブロックしていない可能性があり、Idleがスクリプトが終了したと考えることができないことです。 – noxdafox

+0

いいえ、恐れることはありません。それはgeany/terminalと同じように動作しますが、問題があると思われるアイドルです。再度、感謝します – pythonbutcher

関連する問題