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
walkinrain
V2EX  ›  Python

求助: asyncore.loop 的预期不符!求大大帮忙分析一下,谢谢!

  •  
  •   walkinrain · 2018-09-14 17:08:28 +08:00 · 1689 次点击
    这是一个创建于 2247 天前的主题,其中的信息可能已经有所发展或是发生改变。

    参照官网的例子,写了一个 asyncore.dispatcher 的子类,用于获取信息。 众所周知,现在大多数地方,网站都有链接数量限制。 由于总数量约在 8w 条,考虑限制链接数。 主要功能代码如下:

    if __name__ == "__main__":
        q_in = queue.Queue()
        q_out = queue.Queue()
        conn_count = 5
        with open("ipLib_20.txt", "rb") as frd:
            for line_b in frd:
                q_in.put(line_b)
                cc = WhoisClient(q_in, q_out)
                if len(asyncore.socket_map) >= conn_count:
                    print(f"first len={len(asyncore.socket_map)},q_in = {q_in.qsize()} , q_out = {q_out.qsize()}")
                    asyncore.loop(count=1)
                    print(f"end len={len(asyncore.socket_map)},q_in = {q_in.qsize()} , q_out = {q_out.qsize()}")
                 
        asyncore.loop()
    

    本意为当 socket_map 数量高于一定数量,就等到完成一些再继续增加连接。

    其中 WhoisClient 是仿照官网 HttpClient 改写无问题。

    按照帮助文档中 asyncore.loop()的参数说明,当 count 为默认 None 时,阻塞至所有 WhoisClient 实例完成。count=具体数值时,阻塞至完成 count 个实例。 可是我的代码运行状况却并如预期(保持 5 个连接,做好 1 个继续添加连接)。

    本以为 loop 不阻塞,取消 count=1,结果每 5 个连接完成,继续下 5 个。

    不知道哪位大大能帮我分析分析这个 loop 咋才能达到我的预期啊?

    3 条回复    2018-09-20 18:47:31 +08:00
    kuokyong
        1
    kuokyong  
       2018-09-16 16:07:39 +08:00
    没看懂你的代码。

    建议用 aiohttp client 非常简单。await 就可以。 但 python 需要升级到 3.5+
    walkinrain
        2
    walkinrain  
    OP
       2018-09-17 09:30:01 +08:00
    异步学习阶段,基本上用的都是标准库。
    python 3.7
    用的是标准库 asyncore
    WhoisClient 继承于 asyncore.dispatcher.

    class WhoisClient(asyncore.dispatcher):
    def __init__(self, q_in, q_out):

    q_in 为需要查询的 ip 队列。
    q_out 为查询到的结果队列。

    通过 conn_count 设置最大连接数(同时连接查询网站的连接数)
    主代码就在一楼,也很简单,打开一个文件,每行一条数据读出,压入 q_in 队列。创建 WhoisClient 实例。WhoisClient 异步执行,结果压入 q_out 队列。

    代码本意,超过 conn_count 个链接,等待运行完毕 1 个 WhoisClient,继续创建新的 WhoisClient。

    本意以为 loop 会循环至 1 个 whoisclient 完成,实际 count=1 并未阻塞。
    将 1 楼的 if 换成 while 代码达到预期。

    ===================================
    主要是想大神帮我分析分析 asyncore 中 asyncore.loop 函数具体实现原理与规则。我看了 asyncore.py ,中间 loop 代码段,感觉应该阻塞住到 1 个 whoisclient 完成的啊。
    sww4718168
        3
    sww4718168  
       2018-09-20 18:47:31 +08:00
    asyncore 已经标记废弃了。直接看 asyncio 吧。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   938 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:02 · PVG 05:02 · LAX 13:02 · JFK 16:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.