本發明涉及進程間數據共享技術領域,具體涉及一種基于Python擴展模塊的多進程共享系統及方法。
背景技術:
在Python開發環境中,進程間的交互往往需要共享數據,同時可能存在數據內容的頻繁更新。multiprocessing是Python支持多進程管理的程序包,利用multiprocessing的Value,Array,Manager等結構方法能夠創建共享的對象,多個進程訪問該對象實現數據的共享。
multiprocessing提供多種方法對象實現進程間的數據共享。Manager采用代理與服務器的模式,由manager對象控制服務端進程,該進程包含的Python對象可以被其他進程通過代理的方式訪問,實現進程間的數據共享。Value和Array是另一種簡單對象,主進程創建對象的實例,并將數據存儲在映射的共享內存中,通過參數傳遞的方式供其他進程使用。
以上描述的multiprocessing技術方案存在的主要缺點是:
1、Value結構為單個數據的共享,不能滿足復雜的表結構共享,而Array結構僅允許使用索引訪問共享的數據且個數固定,功能上受到很大的限制;
2、multiprocessing.Manager本身設計為代理與服務器模式,共享數據的性能較差,測試發現在manager中使用Dict對象更新100萬的數據,耗時超過24秒。同時manager對象控制的服務器進程缺少健壯的異常處理機制,容易產生異常子進程。
技術實現要素:
本發明克服了現有技術的不足,提供一種基于Python擴展模塊的多進程共享系統及方法。
為解決上述的技術問題,本發明采用以下技術方案:
一種基于Python擴展模塊的多進程共享方法,所述的方法包括以下步驟:
步驟一、初始化全局管理器并解析輸入參數;
步驟二、分配指定名稱和大小的共享內存,且所述名稱具有唯一性;若已經存在,則執行步驟4,若不存在,則分配固定大小的內存空間;
步驟三、初始化slab內存管理器,構建紅黑樹,并返回創建Python擴展對象;
步驟四、調用功能方法,分析處理后返回PyObject對象。
更進一步的技術方案是所述步驟一包括類型、成員及方法的注冊,以及模塊名稱、內存大小的參數解析。
更進一步的技術方案是所述步驟四中所述調用功能方法包括添加,更新,刪除操作。
更進一步的技術方案是提供一種基于Python擴展模塊的多進程共享系統,包括:
內存管理模塊,用于定義內存管理的接口與程序結構,并且利用原子鎖模塊實現加鎖處理;
紅黑樹模塊,用于實現紅黑樹算法邏輯,提供初始化,插入,刪掉方法;
共享內存模塊,該模塊實現共享內存的分配與回收接口;
原子鎖模塊,用于實現原子互斥鎖邏輯,提供鎖創建,加鎖,解鎖,鎖銷毀方法;
接口模塊,用于利用內存管理模塊,紅黑樹模塊以及原子鎖模塊實現功能調用的接口;
封裝模塊,用于定義Python的擴展類型,注冊對外開放的方法和屬性;
所述共享內存模塊、原子鎖模塊分別連接所述內存管理模塊;所述內存管理模塊連接所述接口模塊;所述紅黑樹模塊連接所述接口模塊;所述原子鎖模塊分別連接所述紅黑樹模塊和接口模塊;所述接口模塊連接所述封裝模塊。
與現有技術相比,本發明實施例的有益效果之一是:
1、本發明相比于multiprocessing等現有技術具有更高的性能,經測試對比發現,操作更新100萬的共享數據,耗時僅為2.5秒,訪問速度提升近10倍;
2、本發明通過使用原子鎖和信號機制,保護處理異常子進程,同時避免出現程序死鎖現象,運行程序更加穩定,異常處理更加完善;
3、本發明合理使用內存管理機制,減少內存碎片化,內存利用更加高效。
附圖說明
圖1為本發明一個實施例的設計步驟圖。
圖2為本發明一個實施例中設計步驟相對應的流程圖。
圖3為本發明另一個實施例的系統模塊結構框圖。
具體實施方式
本說明書中公開的所有特征,或公開的所有方法或過程中的步驟,除了互相排斥的特征和/或步驟以外,均可以以任何方式組合。
本說明書(包括任何附加權利要求、摘要和附圖)中公開的任一特征,除非特別敘述,均可被其他等效或具有類似目的的替代特征加以替換。即,除非特別敘述,每個特征只是一系列等效或類似特征中的一個例子而已。
下面結合附圖及實施例對本發明的具體實施方式進行詳細描述。
實施例1
如圖1和圖2所示,根據本發明的一個實施例,本實施公開一種基于Python擴展模塊的多進程共享方法,該方法的構思是在共享內存的基礎上,首先通過slab內存管理機制優化內存,并使用紅黑樹結構快速的檢索數據,接著利用原子互斥鎖解決數據的沖突問題,最后以模塊擴展的方式在多個Python進程間進行高效的共享數據。
具體的,本實施例基于Python擴展模塊的多進程共享方法包括以下步驟:
步驟1,初始化全局管理器并解析輸入參數,包括類型、成員及方法的注冊,模塊名稱、內存大小的參數解析;
步驟2,分配指定名稱和大小的共享內存,且名稱具有唯一性,若已經存在,則執行步驟4,若不存在,則分配固定大小的內存空間;
步驟3,初始化slab內存管理器,構建紅黑樹,并返回創建Python擴展對象;
步驟4,調用功能方法,分析處理后返回PyObject對象,其功能方法包括添加,更新,刪除等操作。
本實施例方法相比于multiprocessing等現有技術具有更高的性能,經測試對比發現,操作更新100萬的共享數據,耗時僅為2.5秒,訪問速度提升近10倍。
實施例2
如圖3所示,根據本發明的另一個實施例,本實施例公開一種基于Python擴展模塊的多進程共享系統,該系統采用模塊化設計,不同的功能歸屬于不同的模塊,模塊之間利用接口提供服務(如圖3所示)。其中,內存管理模塊負責共享內存的分配和回收,避免造成內存碎片。紅黑樹模塊能夠高效的檢索數據,提高數據訪問的速度。原子鎖模塊除了優化加鎖粒度外,對死鎖問題進行了特殊處理,當出現進程異常崩潰時,由信號注冊處理程序完成強制解鎖,同時提供進程的掛起服務。
具體的,本實施例基于Python擴展模塊的多進程共享系統包括:
內存管理模塊(SLAB),該模塊定義內存管理的接口與程序結構,并且利用原子鎖模塊實現加鎖處理;
紅黑樹模塊(RBTREE),該模塊實現紅黑樹算法邏輯,提供初始化,插入,刪掉等方法;
共享內存模塊(SHMEM),該模塊實現共享內存的分配與回收接口;
原子鎖模塊(SHMTX),該模塊實現原子互斥鎖邏輯,提供鎖創建,加鎖,解鎖,鎖銷毀等方法;
接口模塊(TABLE),該模塊為統一的接口服務,利用內存管理模塊,紅黑樹模塊以及原子鎖模塊實現功能調用的接口;
封裝模塊(MAIN),該模塊定義Python的擴展類型,注冊對外開放的方法和屬性。
所述共享內存模塊、原子鎖模塊分別連接所述內存管理模塊;所述內存管理模塊連接所述接口模塊;所述紅黑樹模塊連接所述接口模塊;所述原子鎖模塊分別連接所述紅黑樹模塊和接口模塊;所述接口模塊連接所述封裝模塊。
本實施例以模塊擴展的方式在多個Python進程間進行高效的共享數據。通過使用原子鎖和信號機制,保護處理異常子進程,同時避免出現程序死鎖現象,運行程序更加穩定,異常處理更加完善;合理使用內存管理機制,減少內存碎片化,內存利用更加高效。
在本說明書中所談到的“一個實施例”、“另一個實施例”、“實施例”等,指的是結合該實施例描述的具體特征、結構或者特點包括在本申請概括性描述的至少一個實施例中。在說明書中多個地方出現同種表述不是一定指的是同一個實施例。進一步來說,結合任一個實施例描述一個具體特征、結構或者特點時,所要主張的是結合其他實施例來實現這種特征、結構或者特點也落在本發明的范圍內。
盡管這里參照發明的多個解釋性實施例對本發明進行了描述,但是,應該理解,本領域技術人員可以設計出很多其他的修改和實施方式,這些修改和實施方式將落在本申請公開的原則范圍和精神之內。更具體地說,在本申請公開權利要求的范圍內,可以對主題組合布局的組成部件和/或布局進行多種變型和改進。除了對組成部件和/或布局進行的變型和改進外,對于本領域技術人員來說,其他的用途也將是明顯的。