メニーコア時代なので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の壁を超えるっ!