现有的情况是这样的,服务器向客户端发包,而客户端使用 python 的 urllib 或者 request,建立连接,然后定时读取收到的数据量,来统计服务器发包的速率。
通过读了一些文档,里面都提到说 socket 的 read(amt)和 recv(amt)虽然默认都是阻塞的模式,但是都是返回此刻可以读取的最大数量值,只有在无法读取数据时才阻塞。
但是问题来了,我在使用 read 的时候,发现不论 amt 设置的大小,read 将会阻塞在其中,直到准确读取到 amt 的数量,这和文档中说到的和我的要求不符合啊==
求助:这和文档中说到的一致么?我要如何做呢?
1
ryanhh11 OP 自顶一下啊
|
2
ryanhh11 OP 很急的求助啊,自顶
|
3
2pang 2018-08-13 11:18:12 +08:00
Note that there are no methods read() or write(); use recv() and send() without flags argument instead.
|
4
2pang 2018-08-13 11:18:58 +08:00
|
5
zhangpeter 2018-08-13 11:23:36 +08:00
代码都没有的吗。。。
|
6
meik2333 2018-08-13 11:35:55 +08:00
有可能是一次到达的数据的大小大于你的 amt
|
7
ryanhh11 OP pm = urllib3.PoolManager()
r = pm.request('GET', url_path, preload_content=False) data_received = 0 start_time = time.time() now = time.time() last_time = time.time() with open(output_file_name, 'w') as out_file: while True: data = r.read(120000) if not data: break 代码是这样的,我打算改成非阻塞的?会不会有用? |
8
meik2333 2018-08-13 11:59:26 +08:00
可能是 urllib3 的 read 要求读到指定数据吧, 可以直接用 socket 读的.
|
9
ryanhh11 OP @zhangpeter 已经贴出来代码了
|
10
d18 2018-08-13 12:14:11 +08:00
传输层的 read 和应用层的 read 不是一个东西,你应该直接用 socket
|
12
wizardoz 2018-08-13 12:58:10 +08:00
gevent
|