簡體   English   中英

Python多處理對象引用

[英]Python multiprocessing object reference

我沒有得到python多處理模塊。 我用函數啟動一個進程,並將pass和object作為參數。 據我了解,它應該是該對象的精確副本。 但是,如果我嘗試打印該對象的地址,則在每個進程中都是相同的。 怎么可能? 不應該在每個過程中都有所不同嗎? 如果它在每個過程中都是同一個對象,那么它的變化對於每個過程來說都不是全局的而是局部的?

我的對象定義如下:

class MyClass():

    my_field = None

    def __init__():
        self.my_field = 0

並且在單獨的過程中運行的功能

def function_to_run_in_process(some_object):
    print some_object

多個流程的結果如下:

<__main__.MyClass instance at 0x7f276419e5f0>
<__main__.MyClass instance at 0x7f276419e5f0>
<__main__.MyClass instance at 0x7f276419e5f0>

等等。

如果我試圖改變進程內部對象的某些字段,如下所示:

def function_to_run_in_process(some_object, process_lock):
   process_lock.acquire()
   some_object.some_field = some_object.some_field + 1
   process_lock.acquire()
   print some_object, 'with some_field = ', some_object.some_field, 'at address: ', hex(id(some_object.some_field))

我得到的結果與此類似:

<__main__.MyClass instance at 0x7f276419e5f0>  with some_field = 1  at address  0xc5c428>
<__main__.MyClass instance at 0x7f276419e5f0>  with some_field = 1  at address  0xc5c428>
<__main__.MyClass instance at 0x7f276419e5f0>  with some_field = 1  at address  0xc5c428>

因此,如果傳遞的對象只是一個副本,為什么不僅對於對象有相同的地址,甚至對於它的字段? 如果他們是相同的,為什么不能看到該領域的變化?

怎么可能?

每個進程都有自己的虛擬地址空間

不應該在每個過程中都有所不同嗎?

不會。子進程繼承其父進程的VAS。 請參閱clonefork

如果它在每個過程中都是同一個對象,那么它的變化對於每個過程來說都不是全局的而是局部的?

VAS中的進程內存頁面將設置為COPY ON WRITE 只要頁面沒有更改,它們都將指向相同的物理內存,但是如果進行任何更改,則該頁面的VAS將映射到不同的位置。


這是一篇關於流程內存管理的文章: http//duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/


如果要在進程之間共享狀態,則可以共享內存或傳遞消息。 多處理模塊可以在共享內存頁面中創建python對象,這在此處描述

但是,最好避免使用, 特別是如果上述所有內容都是新聞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM