自学Python 57 多线程开发(七)使用 Connection对象和共享对象 Shared
生活随笔
收集整理的這篇文章主要介紹了
自学Python 57 多线程开发(七)使用 Connection对象和共享对象 Shared
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
? Python 使用 Connection對象和共享對象 Shared
活動地址:CSDN21天學習挑戰賽
文章目錄
- ? Python 使用 Connection對象和共享對象 Shared
- 一、使用 Connection對象
- 二、使用共享對象 Shared
??本文在多線程開發(五)和(六)的基礎上繼續學習multiprocessing模塊中的內容。
一、使用 Connection對象
??在Python程序中,Connection 對象允許發送和接收可拾取對象或字符串,它們可以被認為是面向消息的連接套接字。例如在下面的實例文件中,演示了使用Connection對象處理數據的過程。
from multiprocessing import Pipe a,b = Pipe() a.send([1,'暑假要結束了!',None]) print(b.recv()) b.send_bytes(b'thank you') print (a.recv_bytes()) import array arr1 = array.array('i', range(5)) arr2 = array.array('i', [0] * 10) a.send_bytes(arr1) count = b.recv_bytes_into(arr2) assert count == len(arr1) * arr1.itemsize print(arr2)??執行后會輸出:
二、使用共享對象 Shared
??在 Python程序中,可以使用由子進程繼承的共享內存創建共享對象,這樣會返回從共享內存分配的ctypes對象。共享對象Shared主要句含加下所示的兩個核心方法。
??(1) multiprocessing.Value(typecode_or_type,* args, lock=True)
??參數說明如下表所示。
| 返回值 | 在默認情況下,返回值實際上是對象的同步包裝器。對象本身可以通過Value的值屬性訪問 |
| 參數typecode_or_type | 確定返回對象的類型,是ctypes類型或array模塊使用的類型的一個字符類型代碼 |
| 參數*args | 被傳遞給類型的構造函數 |
| 參數lock | 如果lock為 True(默認值),則創建一個新的遞歸鎖對象,以同步對該值的訪問。如果lock是 Lock或 RLock 對象,那么它將用于同步對該值的訪問。如果lock是False,那么對返回對象的訪問將不會被鎖自動保護,因此它不一定是“進程安全的” |
??(2)multiprocessing.Array(typecode_or_type, size_or_initializer,*, lock=True)
??參數說明如下表所示。
| 返回值 | 返回從共享內存分配的ctypes數組。在默認情況下,返回值實際上是數組的同步包裝器 |
| typecode_or_type | 確定返回數組的元素類型,是 ctypes類型或array模塊使用的類型的一個字符類型代碼 |
| size_or_initializer | 如果size_or_initializer是一個整數,則它確定數組的長度,并且數組將初始置零。否則 size_or_initializer是用于初始化數組的序列,其長度決定了數組的長度 |
| Lock | 如果lock為 True(默認值),則創建一個新的鎖對象,以同步對該值的訪問。如果lock是Lock或RLock對象,那么它將用于同步對該值的訪問。如果lock是False,那么對返回的對象的訪問將不會被鎖自動保護,因此它不一定是“進程安全的”。請注意,lock是一個僅關鍵字的參數 |
??例如在下面的實例中,演示了使用 Shared 對象將共享內容創建共享ctypes對象的過程。
from multiprocessing import Process,Lock from multiprocessing.sharedctypes import Value, Array from ctypes import Structure,c_double class Point(Structure):_fields_ = [('x', c_double),('y', c_double)] def modify(n, x, s, A):n.value **= 2x.value **= 2s.value = s.value.upper()for a in A:a.x **= 2a.y **= 2 if __name__ == '__main__':lock = Lock()n = Value('i',7)x = Value(c_double, 1.0/3.0, lock=False)s = Array ('c', b'hello world', lock=lock)A = Array(Point, [(1.875,-6.25), (-5.75,2.0), (2.375,9.5)], lock=lock)p = Process(target=modify, args=(n,x,s,A))p.start()p.join()print(n.value)print(x.value)print(s.value)print([(a.x, a.y) for a in A])??執行后會輸出:
總結
以上是生活随笔為你收集整理的自学Python 57 多线程开发(七)使用 Connection对象和共享对象 Shared的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows安全中心(windows
- 下一篇: Tips: Python语言中,《三国演