自学Python 57 多线程开发(七)使用 Connection对象和共享对象 Shared
?
? Python 使用 Connection對象和共享對象 Shared
活動地址:CSDN21天學(xué)習(xí)挑戰(zhàn)賽
文章目錄
- ? Python 使用 Connection對象和共享對象 Shared
- 一、使用 Connection對象
- 二、使用共享對象 Shared
??本文在多線程開發(fā)(五)和(六)的基礎(chǔ)上繼續(xù)學(xué)習(xí)multiprocessing模塊中的內(nèi)容。
一、使用 Connection對象
??在Python程序中,Connection 對象允許發(fā)送和接收可拾取對象或字符串,它們可以被認(rèn)為是面向消息的連接套接字。例如在下面的實例文件中,演示了使用Connection對象處理數(shù)據(jù)的過程。
from multiprocessing import Pipe a,b = Pipe() a.send([1,'暑假要結(jié)束了!',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)??執(zhí)行后會輸出:
二、使用共享對象 Shared
??在 Python程序中,可以使用由子進(jìn)程繼承的共享內(nèi)存創(chuàng)建共享對象,這樣會返回從共享內(nèi)存分配的ctypes對象。共享對象Shared主要句含加下所示的兩個核心方法。
??(1) multiprocessing.Value(typecode_or_type,* args, lock=True)
??參數(shù)說明如下表所示。
| 返回值 | 在默認(rèn)情況下,返回值實際上是對象的同步包裝器。對象本身可以通過Value的值屬性訪問 |
| 參數(shù)typecode_or_type | 確定返回對象的類型,是ctypes類型或array模塊使用的類型的一個字符類型代碼 |
| 參數(shù)*args | 被傳遞給類型的構(gòu)造函數(shù) |
| 參數(shù)lock | 如果lock為 True(默認(rèn)值),則創(chuàng)建一個新的遞歸鎖對象,以同步對該值的訪問。如果lock是 Lock或 RLock 對象,那么它將用于同步對該值的訪問。如果lock是False,那么對返回對象的訪問將不會被鎖自動保護(hù),因此它不一定是“進(jìn)程安全的” |
??(2)multiprocessing.Array(typecode_or_type, size_or_initializer,*, lock=True)
??參數(shù)說明如下表所示。
| 返回值 | 返回從共享內(nèi)存分配的ctypes數(shù)組。在默認(rèn)情況下,返回值實際上是數(shù)組的同步包裝器 |
| typecode_or_type | 確定返回數(shù)組的元素類型,是 ctypes類型或array模塊使用的類型的一個字符類型代碼 |
| size_or_initializer | 如果size_or_initializer是一個整數(shù),則它確定數(shù)組的長度,并且數(shù)組將初始置零。否則 size_or_initializer是用于初始化數(shù)組的序列,其長度決定了數(shù)組的長度 |
| Lock | 如果lock為 True(默認(rèn)值),則創(chuàng)建一個新的鎖對象,以同步對該值的訪問。如果lock是Lock或RLock對象,那么它將用于同步對該值的訪問。如果lock是False,那么對返回的對象的訪問將不會被鎖自動保護(hù),因此它不一定是“進(jìn)程安全的”。請注意,lock是一個僅關(guān)鍵字的參數(shù) |
??例如在下面的實例中,演示了使用 Shared 對象將共享內(nèi)容創(chuàng)建共享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])??執(zhí)行后會輸出:
總結(jié)
以上是生活随笔為你收集整理的自学Python 57 多线程开发(七)使用 Connection对象和共享对象 Shared的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows安全中心(windows
- 下一篇: Tips: Python语言中,《三国演