1

resultsという名前のリストと、 modulesという名前の対応するモジュールのリスト、およびすべての結果とモジュールに適用されるいくつかのオプションがあります。各モジュールには、それに対応する結果に対して呼び出す必要がある関数saveがあります。だから私は次のようなことができます:

q = deque(results)
for module in modules:
    module.save(q.popleft(), options)

または同等:

for i in range(len(modules)):
    modules[i].save(results[i], options)

これはうまくいきます。ただし、これらすべてを同時に行うべきではない理由はありません。しかし、これを可能な限り最良の方法で並列化する方法は、非常に単純であるように思えますが、私にはわかりません。誰かが私を正しい方向に向けることができますか? Python 2.6.6 をお願いします。

4

1 に答える 1

1

の項目result が picklableの場合、 Pool.apply_asyncを使用して次module.saveのように同時に実行します。

import multiprocessing as mp
import itertools as IT
import logging

logger = mp.log_to_stderr(logging.DEBUG)
logger.setLevel(logging.DEBUG)

if __name__ == '__main__':
    pool = mp.Pool()
    for module, result in IT.izip(modules, results):
        pool.apply_async(module.save, args=(result, options))

    pool.close()
    pool.join()

module.py で:

import logging    
logger = logging.getLogger(__name__)

def save():
    logger.debug('Starting save')
    ...
    logger.debug('Exiting save')

で実行するとlogger.setLevel(logging.DEBUG)、多くのデバッグ メッセージが表示され、各プロセスのコード内で Python がどこにあるかを理解するのに役立ちます。

ロギングを停止するには、その行を次のように変更するだけです

logging.disable(logging.CRITICAL)
于 2013-07-22T20:10:07.603 に答える