[英]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。 請參閱clone和fork 。
如果它在每個過程中都是同一個對象,那么它的變化對於每個過程來說都不是全局的而是局部的?
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.