gpt4 book ai didi

python - 套接字线程卡在超时 block 中

转载 作者:行者123 更新时间:2023-11-30 23:43:09 25 4
gpt4 key购买 nike

我正在尝试计算从给定套接字接收所有数据所需的时间,因此我使用“with Timeout(5, False)”等待 5 秒的数据,然后保存上次接收的时间。然而,当我提供多个线程时,当前的代码就会停滞不前并挂起。我需要帮助弄清楚为什么它在应该超时的时候挂起。

#!/usr/bin/env python
import sys
import time
from gevent import socket, Timeout
from gevent.pool import Pool

def calc_wait(website):
data = ''
start = stop = time.time()
sock_buffer = ''

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((website,80))
s.send('HEAD / HTTP/1.1\n\n')

with Timeout(5, False):
while True:
data = s.recv(1024)
if data:
sock_buffer += data
stop = time.time()

print ('Recieved {0} bytes in {1} seconds from {2}'
.format(len(sock_buffer), stop-start, s.getpeername()))

return 0

if __name__ == "__main__":

targs = ['google.com', 'yahoo.com', 'bing.com',\
'tide.com', 'monkey.com', 'python.com',\
'a.com', 'b.com', 'c.com', 'd.com']

pool = Pool(10)
for t in targs:
pool.spawn(calc_wait, t)
pool.join()

最佳答案

问题不在于套接字挂起,而是当套接字结束时您永远不会中断,从而创建无限循环。这是修复它所需的代码:

with Timeout(5, False):
while 1:
data = s.recv(1024)
if not data:
break

sock_buffer += data
stop = time.time()

编辑:一旦套接字完成连接,即使您调用#recv,它也不会产生 greenlet 线程。因此,如果您希望能够触发超时,则需要使用 gevent.sleep() 手动让出:

with Timeout(5, False):
while True:
data = s.recv(1024)
if data:
sock_buffer += data
stop = time.time()

gevent.sleep()

来自 gevent 文档:“以 0 秒调用 sleep 是表达合作 yield 的规范方式。”

关于python - 套接字线程卡在超时 block 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10998715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com