![](/img/trans.png)
[英]Python 3.8 shared_memory resource_tracker producing unexpected warnings at application close
[英]Understanding shared_memory in Python 3.8
我試圖理解一些shared_memory
的操作。
查看源代碼 ,看起來該模塊對UNIX環境使用shm_open()
,在Windows上使用CreateFileMapping
\\ OpenFileMapping
,並結合使用mmap
。
我從這里了解到,為了避免pickle
的徹底序列化/反序列化,需要為其共享數據類型顯式實現__setstate__()
和__getstate__()
。
我在shared_memory.py
沒有看到任何此類實現。
shared_memory
如何繞過泡菜處理?
此外,在Windows機器上,這一點似乎在解釋器中存在:
from mmap import mmap
shared_size = 12
shared_label = "my_mem"
mmap(-1, shared_size , shared_label)
那么為什么需要CreateFileMapping
\\ OpenFileMapping
呢?
shared_memory
如何繞過泡菜處理?
我認為你在進程之間混淆共享ctypes和共享對象 。
首先,您不必使用multiprocessing
提供的共享機制來獲取共享對象,您可以使用您的OS /內核為您提供的任何API來包裝基本原語(如mmap
/ Windows-equivalent)或獲取粉絲。
接下來,您提到的關於如何完成復制以及__getstate__
如何定義酸洗行為的第二個鏈接取決於您 - 使用sharedctypes
模塊API。 您不必強制執行酸洗以在兩個進程之間共享內存。
事實上, sharedctypes
由匿名共享內存支持,它使用: https : //github.com/python/cpython/blob/master/Lib/multiprocessing/heap.py#L31
兩種實現都依賴於類似mmap
的原語。
無論如何,如果你嘗試使用sharedctype
復制一些東西,你會點擊:
而且這個函數正在使用ForkingPickler
,它將使用pickle
然后......最終,你將__getstate__
某個地方調用__getstate__
。
但它與shared_memory
無關,因為shared_memory
實際上不是類似ctype
的對象。
您還可以使用Resource Sharer / Tracker API在進程之間共享對象: https : //github.com/python/cpython/blob/master/Lib/multiprocessing/resource_sharer.py ,它將依賴於pickle
序列化/反序列化。
但是你不通過共享內存共享共享內存,對吧?
使用時: https : //github.com/python/cpython/blob/master/Lib/multiprocessing/shared_memory.py
您使用唯一名稱創建一個內存塊,並且所有進程在共享內存之前必須具有唯一名稱,否則您將無法附加它。
基本上,這個比喻是:
你有一群朋友,你們都擁有一個獨特的秘密基地,只有你擁有這個位置,你才會去做差事,彼此遠離,但你們都可以在這個獨特的地方見面。
為了使其工作,您必須在彼此離開之前知道所在位置。 如果您事先沒有,那么您不能確定您是否能夠找到滿足它們的地方。
這與shared_memory
相同,您只需要打開它的名稱。 您不在進程之間共享/傳輸shared_memory
。 您使用來自多個進程的唯一名稱讀入shared_memory
。
結果,你為什么要腌制它? 您可以。 你絕對可以腌制它。 但這可能不是內置的,因為直接通過另一個共享內存通道或類似的東西將所有進程發送到您的所有進程是很簡單的。
這里不需要規避。 ShareableList
只是SharedMemory
類的應用示例。 正如你在這里看到的那樣: https : //github.com/python/cpython/blob/master/Lib/multiprocessing/shared_memory.py#L314
它需要類似於唯一名稱的東西,您也可以使用匿名共享內存,稍后通過另一個通道傳輸其名稱(編寫臨時文件,將其發送回某些API,無論如何)。
那么為什么需要CreateFileMapping \\ OpenFileMapping呢?
因為它取決於你的Python解釋器,所以你可能正在使用CPython,它正在執行以下操作:
https://github.com/python/cpython/blob/master/Modules/mmapmodule.c#L1440
它已經間接使用CreateFileMapping
因此執行CreateFileMapping
然后附加它只是復制CPython中已經完成的工作。
但是,其他口譯員呢? 是否所有解釋器都執行必要的操作以使mmap
在非POSIX平台上運行? 也許開發人員的理由是這樣的。
無論如何,毫不奇怪mmap
可以開箱即用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.