为什么Python Multiprocess类不会更改属性?

时间:2015-10-20 09:59:12

标签: python multiprocess

#!/usr/bin/env python
from multiprocessing import Process

class Signprocess(Process):
  """docstring for SignThread"""
  def __init__(self):
    super(SignThread, self).__init__()
    self.result = False


  def run(self):
    self.result = True
    print 123

process= Signprocess()
print process.result
process.start()
print process.result
process.join()
print process.result

这是输出

False
False
123
False

这很奇怪,输出123表示实际执行了run()方法,但result属性永远不会设置为True,为什么?

1 个答案:

答案 0 :(得分:3)

Process表示分叉进程,而不是线程。 fork发生后(执行self.result = True之前),内存空间变为未链接状态;除非在共享内存上明确执行或者通过其他形式的IPC传递结果,否则一个进程中的更改不会影响其他进程。阅读更多multiprocessing文档;它提供了许多不同的来回传递数据的方法,但普通的Python对象状态不是这些方式之一。

或者,如果目标是使用线程而不是进程,则将导入行更改为from multiprocessing.dummy import Process,这将获得由线程支持的multiprocessing API,而不是进程;线程共享内存空间,因此您可以看到预期的结果,但在计算成本较高的线程情况下,由于CPython的GIL,您不会从并行性中获得太多收益。