Python如何發(fā)送與接收大型數(shù)組
問(wèn)題
你要通過(guò)網(wǎng)絡(luò)連接發(fā)送和接受連續(xù)數(shù)據(jù)的大型數(shù)組,并盡量減少數(shù)據(jù)的復(fù)制操作。
解決方案
下面的函數(shù)利用 memoryviews 來(lái)發(fā)送和接受大數(shù)組:
# zerocopy.py
def send_from(arr, dest):
view = memoryview(arr).cast('B')
while len(view):
nsent = dest.send(view)
view = view[nsent:]
def recv_into(arr, source):
view = memoryview(arr).cast('B')
while len(view):
nrecv = source.recv_into(view)
view = view[nrecv:]
為了測(cè)試程序,首先創(chuàng)建一個(gè)通過(guò)socket連接的服務(wù)器和客戶(hù)端程序:
>>> from socket import *
>>> s = socket(AF_INET, SOCK_STREAM)
>>> s.bind(('', 25000))
>>> s.listen(1)
>>> c,a = s.accept()
>>>
在客戶(hù)端(另外一個(gè)解釋器中):
>>> from socket import *
>>> c = socket(AF_INET, SOCK_STREAM)
>>> c.connect(('localhost', 25000))
>>>
本節(jié)的目標(biāo)是你能通過(guò)連接傳輸一個(gè)超大數(shù)組。這種情況的話(huà),可以通過(guò) array 模塊或 numpy 模塊來(lái)創(chuàng)建數(shù)組:
# Server >>> import numpy >>> a = numpy.arange(0.0, 50000000.0) >>> send_from(a, c) >>> # Client >>> import numpy >>> a = numpy.zeros(shape=50000000, dtype=float) >>> a[0:10] array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) >>> recv_into(a, c) >>> a[0:10] array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) >>>
討論
在數(shù)據(jù)密集型分布式計(jì)算和平行計(jì)算程序中,自己寫(xiě)程序來(lái)實(shí)現(xiàn)發(fā)送/接受大量數(shù)據(jù)并不常見(jiàn)。 不過(guò),要是你確實(shí)想這樣做,你可能需要將你的數(shù)據(jù)轉(zhuǎn)換成原始字節(jié),以便給低層的網(wǎng)絡(luò)函數(shù)使用。 你可能還需要將數(shù)據(jù)切割成多個(gè)塊,因?yàn)榇蟛糠趾途W(wǎng)絡(luò)相關(guān)的函數(shù)并不能一次性發(fā)送或接受超大數(shù)據(jù)塊。
一種方法是使用某種機(jī)制序列化數(shù)據(jù)——可能將其轉(zhuǎn)換成一個(gè)字節(jié)字符串。 不過(guò),這樣最終會(huì)創(chuàng)建數(shù)據(jù)的一個(gè)復(fù)制。 就算你只是零碎的做這些,你的代碼最終還是會(huì)有大量的小型復(fù)制操作。
本節(jié)通過(guò)使用內(nèi)存視圖展示了一些魔法操作。 本質(zhì)上,一個(gè)內(nèi)存視圖就是一個(gè)已存在數(shù)組的覆蓋層。不僅僅是那樣, 內(nèi)存視圖還能以不同的方式轉(zhuǎn)換成不同類(lèi)型來(lái)表現(xiàn)數(shù)據(jù)。 這個(gè)就是下面這個(gè)語(yǔ)句的目的:
view = memoryview(arr).cast('B')
它接受一個(gè)數(shù)組 arr并將其轉(zhuǎn)換為一個(gè)無(wú)符號(hào)字節(jié)的內(nèi)存視圖。這個(gè)視圖能被傳遞給socket相關(guān)函數(shù), 比如 socket.send() 或 send.recv_into() 。 在內(nèi)部,這些方法能夠直接操作這個(gè)內(nèi)存區(qū)域。例如,sock.send() 直接從內(nèi)存中發(fā)生數(shù)據(jù)而不需要復(fù)制。 send.recv_into() 使用這個(gè)內(nèi)存區(qū)域作為接受操作的輸入緩沖區(qū)。
剩下的一個(gè)難點(diǎn)就是socket函數(shù)可能只操作部分?jǐn)?shù)據(jù)。 通常來(lái)講,我們得使用很多不同的 send() 和 recv_into() 來(lái)傳輸整個(gè)數(shù)組。 不用擔(dān)心,每次操作后,視圖會(huì)通過(guò)發(fā)送或接受字節(jié)數(shù)量被切割成新的視圖。 新的視圖同樣也是內(nèi)存覆蓋層。因此,還是沒(méi)有任何的復(fù)制操作。
這里有個(gè)問(wèn)題就是接受者必須事先知道有多少數(shù)據(jù)要被發(fā)送, 以便它能預(yù)分配一個(gè)數(shù)組或者確保它能將接受的數(shù)據(jù)放入一個(gè)已經(jīng)存在的數(shù)組中。 如果沒(méi)辦法知道的話(huà),發(fā)送者就得先將數(shù)據(jù)大小發(fā)送過(guò)來(lái),然后再發(fā)送實(shí)際的數(shù)組數(shù)據(jù)。
以上就是Python如何發(fā)送與接收大型數(shù)組的詳細(xì)內(nèi)容,更多關(guān)于Python發(fā)送接收大型數(shù)組的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python如何實(shí)現(xiàn)大型數(shù)組運(yùn)算(使用NumPy)
- python3通過(guò)udp實(shí)現(xiàn)組播數(shù)據(jù)的發(fā)送和接收操作
- Python udp網(wǎng)絡(luò)程序?qū)崿F(xiàn)發(fā)送、接收數(shù)據(jù)功能示例
- Python 網(wǎng)絡(luò)編程之UDP發(fā)送接收數(shù)據(jù)功能示例【基于socket套接字】
- python UDP(udp)協(xié)議發(fā)送和接收的實(shí)例
- python 發(fā)送和接收ActiveMQ消息的實(shí)例
- Python微信企業(yè)號(hào)開(kāi)發(fā)之回調(diào)模式接收微信端客戶(hù)端發(fā)送消息及被動(dòng)返回消息示例
- python通過(guò)get,post方式發(fā)送http請(qǐng)求和接收http響應(yīng)的方法
- Python中使用socket發(fā)送HTTP請(qǐng)求數(shù)據(jù)接收不完整問(wèn)題解決方法
- python發(fā)送郵件接收郵件示例分享
相關(guān)文章
在python中實(shí)現(xiàn)發(fā)送短信功能
工作中我們經(jīng)常會(huì)用到發(fā)短信的需求,那么如何在python代碼中實(shí)現(xiàn)發(fā)短息你的需求呢,本文我們就一起深入探討下,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2024-04-04
python教程十行代碼教你語(yǔ)音轉(zhuǎn)文字QQ微信聊天
QQ上面發(fā)的語(yǔ)音消息是可以直接文字識(shí)別的,但是微信為什么沒(méi)有呢?是因?yàn)榧夹g(shù)太難實(shí)現(xiàn)嗎?這個(gè)很簡(jiǎn)單??!今天給大家介紹一下語(yǔ)音轉(zhuǎn)文字的原理2021-09-09
在python 不同時(shí)區(qū)之間的差值與轉(zhuǎn)換方法
今天小編就為大家分享一篇在python 不同時(shí)區(qū)之間的差值與轉(zhuǎn)換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Django admin model 漢化顯示文字的實(shí)現(xiàn)方法
今天小編就為大家分享一篇Django admin model 漢化顯示文字的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
Python通過(guò)Pillow實(shí)現(xiàn)圖片對(duì)比
這篇文章主要介紹了Python Pillow實(shí)現(xiàn)圖片對(duì)比,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
python的數(shù)學(xué)算法函數(shù)及公式用法
在本篇內(nèi)容里小編給大家分享了一篇關(guān)于python的數(shù)學(xué)算法函數(shù)及公式用法,有興趣的朋友們可以參考下。2020-11-11

