При использовании starmap в python, почему местоположение переменной, переданной с использованием замыкания, отличается от того, что передано с использованием частичного? - PullRequest
0 голосов
/ 20 ноября 2018

Когда я запускаю следующий код, я вижу, что переменные 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>

Если в главном потоке выполняется частичная функция, все три оператора печати показывают, что печатаемые переменные ссылаются на один и тот же экземпляр.

Если он запускается со звездообразным изображением, то расположение z внутри функцииотличается от w вне функции.Этого я и ожидал, так как функция отправляется в разностный процесс для запуска и, по-видимому, сериализации / десериализации.Тем не менее, когда я запускаю starmap, расположение w внутри и снаружи функции одинаково, и я чувствую, что мне не хватает фундаментального понимания того, почему ... Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 26 ноября 2018

В случае, если кто-нибудь наткнется на это: я полагаю, что причина в том, что когда в этой системе создается новый процесс, копируется существующая куча, именно поэтому w до сих пор эффективно работает.Не стесняйтесь поправлять меня, если это не так!

...