是否可以在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。
答案 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。