2

私は、concurrent.futures の ThreadPoolExecutor を使用して、スクリプトのパフォーマンスを改善しようとしています。Popen を介していくつかの外部 python スクリプトを起動し、それらを将来のオブジェクトとしてカプセル化していますが、これらのオブジェクトは完了としてコールバック関数に入りますが、マシンで実行されているのを見ることができます (かなりの時間実行されます)。コードは次のようになります。

with futures.ThreadPoolExecutor(max_workers=4) as executor: 
        p1 = executor.submit(subprocess.Popen([myotherPythonscript1], stdout = subprocess.PIPE))
        p1.add_done_callback(process_result)
        p2 = executor.submit(subprocess.Popen([myotherPythonscript2], stdout = subprocess.PIPE))
        p2.add_done_callback(process_result)

def process_result( future ):
        logger.info( "Seeding process finished...")

また、running() および wait() の将来の関数を使用してさまざまなアプローチを試みましたが、結果は同じでした。将来のオブジェクトは既に完了しているとマークされていますが、実際にはまだ実行中です。何か不足していますか?

ありがとう、

4

1 に答える 1

5

結果をPopenエグゼキュータに渡すだけではなく、呼び出し可能オブジェクトを渡す必要があります。

>>> from concurrent.futures import *
>>> from subprocess import *
>>> executor = ThreadPoolExecutor(4)
>>> future = executor.submit(Popen(['echo', 'test'], stdout=PIPE))
>>> future.exception()
TypeError("'Popen' object is not callable",)

一方、これは機能します。

from concurrent.futures import *
from subprocess import *

def make_call():
    process = Popen(['echo', 'test'], stdout=PIPE)
    return process.communicate()[0]

executor = ThreadPoolExecutor(4)
future = executor.submit(make_call)
print(future.result())
于 2012-05-14T13:36:47.927 に答える