非同步非阻塞socket的實現

2022-08-20 13:45:12 字數 2427 閱讀 6506

在學習使用scrapy爬蟲框架之前,需要了解一些基礎原理

我們知道http請求是基於socket模組進行傳送和接受的,但是socket套接字的在使用的中存在著阻塞,不利用爬蟲的高效能執行,所以我們就需要對框架進行一些高效能設定,使用select模組,檢測socket請求的io操作,實現對socket的高效能執行:

以下是**示例:

import

socket

import

select

class

request(object):

'''request類的定義是應對請求的連線不同時,做的低耦合操作

'''def

__int__

(self,sock,info):

self.sock=sock

self.info=info

deffileno(self):

'''因為select模組在檢測io操作但是針對socket物件,該物件中必須有fileno方法才能呼叫,

因此需要我們自己定義乙個request類,在類下包含fileno方法

:return:

'''return

self.sock.fileno()

class

mysocket(object):

def__int__

(self):

'''初始化兩個列表,儲存socket物件

:return:

'''self.sock_list=

self.conns=

defadd_request(self,req_info):

'''建立請求

:param req_info:

:return:

'''sock=socket.socket()

sock.setblocking(false)

#設定socket為非阻塞狀態

try:

sock.connect((req_info[

'host

'],req_info['

post

']))

except

baseexception as e:

pass

#使用try方法防止sock在非阻塞狀態下報錯

obj=request(sock,req_info)#

示例話request類,此類就是socket例項化的物件

defrun(self):

'''開始事件迴圈,檢測:連線是否成功,是否有資料返回

:return:

'''while

true:

r,w,e=select.select(self.sock_list,self.conns,,0.05)

#select。select([socket物件,]),可以是任何物件,但是物件一定要有

#fileno方法,所以需要自己去定義request類

#在此處就呼叫request物件

#seclet引數w數值就是檢測請求是否成功

for obj in

w:

#檢查obj.request物件

#該連線在成功請求過後,為防止重**送請求,需請求列表中將其刪除

#資料返回,接受到資料

for obj in

r: response=obj.sock.recv(8096)

obj.info[

"callback

"](response)

self.sock_list.remove(obj)

from .. import

mysocket

defdata(response):

'''**函式,對返回的資料進行操作

:param response:

:return:

'''print

(response)

deffile(response):

'''**函式,對返回數值的第二種操作方式

:param response:

:return:

'''print

(response)

url_list =[,,

,]obj=mysocket()

for item in

url_list:

obj.add_request(item)

obj.run()

Socket(二) 同步 非同步 阻塞 非阻塞

阻塞 客戶端去server端請求10個位元組資料。tcp傳輸分兩步,乙個是head,乙個是body。server端給客戶端傳送head的目的是告訴客戶端,這次tcp會傳10個位元組。然後,body開始傳給客戶端。如果網路很慢,傳到第6個位元組了,那麼,客戶端知道還沒有收完,就會在第6個位元組這裡一直...

socket 阻塞與非阻塞 同步與非同步

阻塞與非阻塞。所謂阻塞方式的意思是指,當試圖對該檔案描述符進行讀寫時,如果當時沒有東西可讀,或者暫時不可寫,程式就進入等待狀態,直到有東西可讀或者可寫為止。而對於非阻塞狀態,如果沒有東西可讀,或者不可寫,讀寫函式馬上返回,而不會等待。預設情況下,三述符處於阻塞狀態。同步非同步與阻塞和非阻塞是兩種不同...

Socket 同步非同步 和 阻塞非阻塞的區別

老張愛喝茶,廢話不說,煮開水。出場人物 老張,水壺兩把 普通水壺,簡稱水壺 會響的水壺,簡稱響水壺 1 老張把水壺放到火上,立等水開。同步阻塞 老張覺得自己有點傻 2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。同步非阻塞 老張還是覺得自己有點傻,於是變高階了,買了把會響笛的那種水壺...