为什么 Python Multiprocess class 不更改属性?
Why Python Multiprocess class doesn't change the attribute?
#!/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
,为什么?
Process
代表一个forked进程,不是线程。在 fork
发生后(在 self.result = True
执行之前),内存 space 变为未链接;一个进程中的更改不会影响另一个进程,除非在共享内存上明确执行或结果通过某种其他形式的 IPC 进行通信。阅读更多 multiprocessing
文档;它提供了许多不同的方式来回传递数据,但普通的 Python 对象状态不是其中一种方式。
或者,如果目标是使用线程而不是进程,请将导入行更改为 from multiprocessing.dummy import Process
,这将使您获得由线程而不是进程支持的 multiprocessing
API;线程共享内存 space,因此您会看到预期的结果,尽管在计算量大的线程情况下,由于 CPython 的 GIL,您不会从并行性中获益太多。
#!/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
,为什么?
Process
代表一个forked进程,不是线程。在 fork
发生后(在 self.result = True
执行之前),内存 space 变为未链接;一个进程中的更改不会影响另一个进程,除非在共享内存上明确执行或结果通过某种其他形式的 IPC 进行通信。阅读更多 multiprocessing
文档;它提供了许多不同的方式来回传递数据,但普通的 Python 对象状态不是其中一种方式。
或者,如果目标是使用线程而不是进程,请将导入行更改为 from multiprocessing.dummy import Process
,这将使您获得由线程而不是进程支持的 multiprocessing
API;线程共享内存 space,因此您会看到预期的结果,尽管在计算量大的线程情况下,由于 CPython 的 GIL,您不会从并行性中获益太多。