Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

自作multiprocessingプログラムサンプル

別に2.6じゃなくても簡単に書こうと思えば書けるよねえ。
でmultiprocessingモジュールの中身はどうなってるのかって話があまり書かれてない感じだったので書いてみた。

概略的なコードは以下。

import os
import sys 
import time

class Process(object):

    def __init__(self, target=None, args=()):
        self._target = target
        self._args = args

    def _run(self):
        self._target(*self._args)

    def _bootstrap(self):
        self._run()
        return 0

    def start(self):
        self.popen = Popen(self)

class Popen(object):

    def __init__(self, process):
        sys.stdout.flush()
        sys.stderr.flush()
        self.pid = os.fork()
        if self.pid == 0:
            code = process._bootstrap()
            sys.stdout.flush()
            sys.stderr.flush()
            os._exit(code)
    
def test():
    print("test")

p = Process(target=test)
p.start()
time.sleep(10)

終了系とか、current_processを上書きするとか細かいところは省略。
(まあそこ肝なのかも知れないけど)
閉じ込め方の基本概念はこんな感じ。
pid=0の子プロセス時だけprocessクラスを走らせるというだけなのでそんなむずくない。
もっと下の突っ込んだ話はliris先生が書いてくれるはずです。