新手请教 Python 网络编程的 read 阻塞问题

2018-08-13 10:36:16 +08:00
 ryanhh11

现有的情况是这样的,服务器向客户端发包,而客户端使用 python 的 urllib 或者 request,建立连接,然后定时读取收到的数据量,来统计服务器发包的速率。

通过读了一些文档,里面都提到说 socket 的 read(amt)和 recv(amt)虽然默认都是阻塞的模式,但是都是返回此刻可以读取的最大数量值,只有在无法读取数据时才阻塞。

但是问题来了,我在使用 read 的时候,发现不论 amt 设置的大小,read 将会阻塞在其中,直到准确读取到 amt 的数量,这和文档中说到的和我的要求不符合啊==

求助:这和文档中说到的一致么?我要如何做呢?

1925 次点击
所在节点    Python
12 条回复
ryanhh11
2018-08-13 10:57:51 +08:00
自顶一下啊
ryanhh11
2018-08-13 11:08:06 +08:00
很急的求助啊,自顶
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.
2pang
2018-08-13 11:18:58 +08:00
zhangpeter
2018-08-13 11:23:36 +08:00
代码都没有的吗。。。
meik2333
2018-08-13 11:35:55 +08:00
有可能是一次到达的数据的大小大于你的 amt
ryanhh11
2018-08-13 11:44:09 +08:00
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

代码是这样的,我打算改成非阻塞的?会不会有用?
meik2333
2018-08-13 11:59:26 +08:00
可能是 urllib3 的 read 要求读到指定数据吧, 可以直接用 socket 读的.
ryanhh11
2018-08-13 12:01:46 +08:00
@zhangpeter 已经贴出来代码了
d18
2018-08-13 12:14:11 +08:00
传输层的 read 和应用层的 read 不是一个东西,你应该直接用 socket
ryanhh11
2018-08-13 12:32:33 +08:00
@d18 嗯,我准备直接用 socket 了
wizardoz
2018-08-13 12:58:10 +08:00
gevent

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/479227

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX