Python多处理子类初始化

时间:2016-07-18 21:19:22

标签: python python-multiprocessing

是否可以在multiprocessing.Process方法中初始化__init__()子类的状态?或者这会导致进程分叉时资源利用率重复吗?举个例子:

from multiprocessing import Process, Pipe
import time

class MyProcess(Process):
    def __init__(self, conn, bar):
        super().__init__()
        self.conn = conn
        self.bar = bar
        self.databuffer = []

    def foo(self, baz):
        return self.bar * baz

    def run(self):
        '''Process mainloop'''
        running = True
        i = 0
        while running:
            self.databuffer.append(self.foo(i))
            if self.conn.poll():
                m = self.conn.recv()
                if m=='get':
                    self.conn.send((i, self.databuffer))
                elif m=='stop':
                    running = False
            i += 1
            time.sleep(0.1)


if __name__=='__main__':
    conn, child_conn = Pipe()
    p = MyProcess(child_conn, 5)
    p.start()      
    time.sleep(2)

    # Touching the instance does not affect the process which has forked.
    p.bar=1
    print(p.databuffer)

    time.sleep(2)
    conn.send('get')
    i,data = conn.recv()
    print(i,data)
    conn.send('stop')
    p.join()

正如我在代码中所述,您无法通过实例p与流程进行通信,只能通过Pipe进行通信,因此如果我在__init__方法中进行了大量设置,作为创建文件句柄,当进程分叉时如何重复?

这是否意味着以与multiprocessing.Process一个坏主意相同的方式对threading.Thread进行子类化?

请注意,我的进程长时间运行并且意味着处理阻塞IO。

1 个答案:

答案 0 :(得分:1)

这很容易测试。在__init__中,添加以下内容:

 self.file = open('does_it_open.txt'.format(self.count), 'w')

然后运行:

 $ strace -f python youprogram.py 2> test.log
 $ grep does_it_open test.log
 open("does_it_open.txt", O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = 6

这意味着至少在我的系统上,复制代码并添加该调用,该文件只打开一次,而且只打开一次。

有关strace的魔法的更多信息,请查看this fantastic blog post