Pythonでmultiprocessingを使って並列処理

メニーコア時代なのでPythonでもCPUいっぱい使いたいんですよ。まずはサンプルソース。Djangoのコマンドで使ったものから取ってきたのでmultiprocessingと関係ない部分もあります。

# -*- coding: utf-8 -*-

import multiprocessing
from multiprocessing import Process, Pool

from django.core.management.base import BaseCommand

def make_and_post(_file):
    print(_file)
    return True

class Command(BaseCommand):

    def main(self):
        _p = Pool(multiprocessing.cpu_count() / 2)
        print(_p.map(make_and_post, ['a', 'b', 'c', 'd']))

    def handle(self, *args, **options):
        self.main()

実行した結果の出力は以下

a
c
b
d
[True, True, True, True]

Poolでコア数/2を指定しているので、コア数の半分(i7のMBPだと4コアなので、半分で2になります)の並列処理ができます。

make_and_postをmapから呼んでいますが、make_and_postに渡されるのはリストではありません。リストの要素のひとつが渡されます。’a’とか’b’とかです。

make_and_postの返り値がTrue(失敗してればFalseでしょう)なので、_p.map()を出力するとTrueとかFalseが入ったリストになっています。

PythonにはGILというものがあり、フツーに書いてるだけでは一個のコアしか使ってくれません。32コアとかあっても働いてるのは1コアとかの残念な結果になりがちです。それが悪いとは言わないが、もっと頑張って欲しい時もあるんですよ。

上記サンプルはPython2.7.3で、MacOSXで動かしました。

これでGILの壁を超えるっ!