使用python的starmap时,为什么用闭包传入的变量位置和用partial传入的不一样?
When using python's starmap, why is the location of a variable passed in using a closure different from that passed in using partial?
当我运行下面的代码时,我看到函数内的变量 z 和 w 有不同的位置,但我不明白为什么会这样。
import multiprocessing
from functools import partial
class SomeClass:
pass
w = SomeClass()
print("w outside function")
print(w)
def some_function(x, y, z):
print("w inside function")
print(w)
print("z")
print(z)
return x * 2
pool = multiprocessing.Pool(processes=4)
some_function_partial = partial(some_function, z=w)
summary = pool.starmap(some_function_partial, [(3, 2)])
pool.close()
pool.join()
输出:
w outside function
<__main__.SomeClass object at 0x104916080>
w inside function
<__main__.SomeClass object at 0x104916080>
z
<__main__.SomeClass object at 0x104ef66d8>
如果部分函数在主线程上 运行 所有三个打印语句都表明正在打印的变量引用同一个实例。
如果是 运行 with starmap 函数内 z 的位置与函数外 w 的位置不同。这是我所期望的,因为函数被发送到一个不同的过程是 运行 并且大概是 serialised/deserialised。
但是,当我 运行 使用 starmap 时,w 在函数内部和外部的位置是相同的,我觉得我缺少一些关于为什么的基本理解......任何帮助将不胜感激!
以防万一有人偶然发现:我相信原因是因为当在此系统上创建新进程时,现有堆被复制,这就是为什么 w 在有效范围内有效。
如果这有误,请随时纠正我!
当我运行下面的代码时,我看到函数内的变量 z 和 w 有不同的位置,但我不明白为什么会这样。
import multiprocessing
from functools import partial
class SomeClass:
pass
w = SomeClass()
print("w outside function")
print(w)
def some_function(x, y, z):
print("w inside function")
print(w)
print("z")
print(z)
return x * 2
pool = multiprocessing.Pool(processes=4)
some_function_partial = partial(some_function, z=w)
summary = pool.starmap(some_function_partial, [(3, 2)])
pool.close()
pool.join()
输出:
w outside function
<__main__.SomeClass object at 0x104916080>
w inside function
<__main__.SomeClass object at 0x104916080>
z
<__main__.SomeClass object at 0x104ef66d8>
如果部分函数在主线程上 运行 所有三个打印语句都表明正在打印的变量引用同一个实例。
如果是 运行 with starmap 函数内 z 的位置与函数外 w 的位置不同。这是我所期望的,因为函数被发送到一个不同的过程是 运行 并且大概是 serialised/deserialised。 但是,当我 运行 使用 starmap 时,w 在函数内部和外部的位置是相同的,我觉得我缺少一些关于为什么的基本理解......任何帮助将不胜感激!
以防万一有人偶然发现:我相信原因是因为当在此系统上创建新进程时,现有堆被复制,这就是为什么 w 在有效范围内有效。 如果这有误,请随时纠正我!