V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ryanhh11
V2EX  ›  Python

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

  •  
  •   ryanhh11 · 2018-08-13 10:36:16 +08:00 · 2020 次点击
    这是一个创建于 2294 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    12 条回复    2018-08-13 12:58:10 +08:00
    ryanhh11
        1
    ryanhh11  
    OP
       2018-08-13 10:57:51 +08:00
    自顶一下啊
    ryanhh11
        2
    ryanhh11  
    OP
       2018-08-13 11:08:06 +08:00
    很急的求助啊,自顶
    2pang
        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.
    2pang
        4
    2pang  
       2018-08-13 11:18:58 +08:00
    zhangpeter
        5
    zhangpeter  
       2018-08-13 11:23:36 +08:00
    代码都没有的吗。。。
    meik2333
        6
    meik2333  
       2018-08-13 11:35:55 +08:00
    有可能是一次到达的数据的大小大于你的 amt
    ryanhh11
        7
    ryanhh11  
    OP
       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
        8
    meik2333  
       2018-08-13 11:59:26 +08:00
    可能是 urllib3 的 read 要求读到指定数据吧, 可以直接用 socket 读的.
    ryanhh11
        9
    ryanhh11  
    OP
       2018-08-13 12:01:46 +08:00
    @zhangpeter 已经贴出来代码了
    d18
        10
    d18  
       2018-08-13 12:14:11 +08:00
    传输层的 read 和应用层的 read 不是一个东西,你应该直接用 socket
    ryanhh11
        11
    ryanhh11  
    OP
       2018-08-13 12:32:33 +08:00
    @d18 嗯,我准备直接用 socket 了
    wizardoz
        12
    wizardoz  
       2018-08-13 12:58:10 +08:00
    gevent
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1292 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:56 · PVG 01:56 · LAX 09:56 · JFK 12:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.