第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何在Python線程中中止/取消HTTP請(qǐng)求?

如何在Python線程中中止/取消HTTP請(qǐng)求?

莫回?zé)o 2023-12-09 15:47:38
我正在尋找中止/取消 Python 線程中的 HTTP 請(qǐng)求。我必須堅(jiān)持使用線程。我無(wú)法使用 asyncio 或標(biāo)準(zhǔn)庫(kù)之外的任何內(nèi)容。此代碼適用于套接字:"""Demo for Canceling IO by Closing the SocketWorks!"""import socketimport timefrom concurrent import futuresstart_time = time.time()sock = socket.socket()def read():    "Read data with 10 second delay."    sock.connect(('httpbin.org', 80))    sock.sendall(b'GET /delay/10 HTTP/1.0\r\n\r\n')    while True:        data = sock.recv(1024)        if not data:            break        print(data.decode(), end='')with futures.ThreadPoolExecutor() as pool:    future = pool.submit(read)    futures.wait([future], timeout=5)    sock.close()  # <-- Interrupt sock.recv(1024) in Thread:read().end_time = time.time()print(f'Duration: {end_time - start_time:.3f}')# Duration is ~5s as expected.在主線程中關(guān)閉套接字用于中斷執(zhí)行器池線程中的recv()。HTTP 請(qǐng)求應(yīng)該需要 10 秒,但我們只等待 5 秒,然后關(guān)閉套接字(有效地取消 HTTP 請(qǐng)求/響應(yīng))?,F(xiàn)在我嘗試使用 http.client:"""Demo for Canceling IO in Threads with HTTP ClientDoesn't work!"""import timefrom concurrent import futuresfrom http.client import HTTPConnectiondef get(con, url):    con.request('GET', url)    response = con.getresponse()    return responsestart_time = time.time()with futures.ThreadPoolExecutor() as executor:    con = HTTPConnection('httpbin.org')    future = executor.submit(get, con, '/delay/10')    done, not_done = futures.wait([future], timeout=5)    con.sock.close()end_time = time.time()print(f'Duration: {end_time - start_time:.3f}')# Duration is ~10s unfortunately.不幸的是,這里的總持續(xù)時(shí)間約為 10 秒。關(guān)閉套接字不會(huì)中斷客戶端中的recv_into()??磥?lái)我做出了一些錯(cuò)誤的假設(shè)。如何從單獨(dú)的線程中斷 http 客戶端中使用的套接字?
查看完整描述

1 回答

?
DIEA

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超2個(gè)贊

您所描述的是預(yù)期的有據(jù)可查的行為:

注意 close() 釋放與連接關(guān)聯(lián)的資源,但不一定立即關(guān)閉連接。如果要及時(shí)關(guān)閉連接,請(qǐng)?jiān)?close() 之前調(diào)用 shutdown()。

有關(guān)此行為的一些進(jìn)一步詳細(xì)信息仍然可以在 CPython howto 文檔中找到:

嚴(yán)格來(lái)說(shuō),您應(yīng)該在關(guān)閉套接字之前對(duì)其使用 shutdown 。關(guān)閉是對(duì)另一端套接字的建議。根據(jù)您傳遞的參數(shù),它可能意味著“我不會(huì)再發(fā)送,但我仍然會(huì)聽(tīng)”,或者“我不聽(tīng),很好的擺脫!”。然而,大多數(shù)套接字庫(kù)已經(jīng)習(xí)慣了程序員忽略使用這一禮儀,通常關(guān)閉與 shutdown() 相同;關(guān)閉()。因此在大多數(shù)情況下,不需要顯式關(guān)閉。

有效使用 shutdown 的一種方法是使用類似 HTTP 的交換??蛻舳税l(fā)送請(qǐng)求,然后執(zhí)行關(guān)閉(1)。這告訴服務(wù)器“該客戶端已完成發(fā)送,但仍然可以接收。” 服務(wù)器可以通過(guò)接收 0 字節(jié)來(lái)檢測(cè)“EOF”。它可以假設(shè)它具有完整的請(qǐng)求。服務(wù)器發(fā)送回復(fù)。如果發(fā)送成功完成,那么客戶端確實(shí)仍在接收。

Python 在自動(dòng)關(guān)閉方面更進(jìn)了一步,它表示當(dāng)套接字被垃圾回收時(shí),如果需要它會(huì)自動(dòng)關(guān)閉。但依賴這一點(diǎn)是一個(gè)非常不好的習(xí)慣。如果您的套接字在沒(méi)有執(zhí)行關(guān)閉的情況下就消失了,另一端的套接字可能會(huì)無(wú)限期地掛起,認(rèn)為您只是速度慢。完成后請(qǐng)關(guān)閉套接字。

解決方案

關(guān)閉之前調(diào)用 shutdown。

例子

with futures.ThreadPoolExecutor() as executor:
    con = HTTPConnection('httpbin.org')
    future = executor.submit(get, con, '/delay/10')
    done, not_done = futures.wait([future], timeout=5)
    con.sock.shutdown()
    con.sock.close()


查看完整回答
反對(duì) 回復(fù) 2023-12-09
  • 1 回答
  • 0 關(guān)注
  • 218 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)