午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python如何發(fā)送與接收大型數(shù)組

瀏覽:14日期:2022-07-14 17:21:58

問(wèn)題

你要通過(guò)網(wǎng)絡(luò)連接發(fā)送和接受連續(xù)數(shù)據(jù)的大型數(shù)組,并盡量減少數(shù)據(jù)的復(fù)制操作。

解決方案

下面的函數(shù)利用 memoryviews 來(lái)發(fā)送和接受大數(shù)組:

# zerocopy.pydef 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ù)器和客戶端程序:

>>> from socket import *>>> s = socket(AF_INET, SOCK_STREAM)>>> s.bind((’’, 25000))>>> s.listen(1)>>> c,a = s.accept()>>>

在客戶端(另外一個(gè)解釋器中):

>>> from socket import *>>> c = socket(AF_INET, SOCK_STREAM)>>> c.connect((’localhost’, 25000))>>>

本節(jié)的目標(biāo)是你能通過(guò)連接傳輸一個(gè)超大數(shù)組。這種情況的話,可以通過(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ì)算程序中,自己寫程序來(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)表現(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)辦法知道的話,發(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)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 五月婷视频 | 亚洲深夜福利视频 | 天天撸夜夜操 | 中文字幕 自拍偷拍 | 视频一区二区视频 | 香蕉视频最新网址 | 亚洲第一页乱 | 成年人三级网站 | 青青国产在线观看 | 天天爽天天射 | 国产一级大片在线观看 | 日本精品视频一区二区 | 91精品国产一区二区三区 | 国产午夜麻豆影院在线观看 | 日韩综合在线视频 | 久久精品国产一区二区三区 | 成人午夜免费福利视频 | 成人av免费看 | 国产又粗又硬又长 | 日韩专区在线 | 日韩精品免费一区二区在线观看 | 国产免费一区二区三区四在线播放 | 中文字幕亚洲视频 | 粉嫩av性色av蜜臀av网站 | 91在线看视频| 国产热| 欧美精品一区二区三 | 污网站在线观看免费 | xxx日本黄色| 日本中文字幕一区 | 久久综合亚洲 | 日韩操操操| 在线观看av网站 | 涩涩网站在线观看 | 五月婷婷六月婷婷 | 日韩一区二区在线观看视频 | 亚洲大尺度在线观看 | 久99热| 超碰在线人| 男人av网 | 日日夜夜天天综合 |