簡體   English   中英

理解Python 3.8中的shared_memory

[英]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.

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