V2EX 首页   注册   登录
 resolvewang 最近的时间轴更新

resolvewang

  •   V2EX 第 181389 号会员,加入于 2016-07-12 10:35:43 +08:00
    分布式微博爬虫:https://github.com/ResolveWang/WeiboSpider。欢迎大家试用
    resolvewang 最近回复了
    @junneyang 谢谢回答。thrift 是跨语言,但 thriftpy 应该不跨语言,我也没深入使用,这方面还是小白。感谢
    经过一段时间的思考,我现在的理解是,thrift 它是为不同项目提供 rpc 调用,而 celery 却是单一项目的 rpc 调用,需要共享相同的 Celery 实例。
    目前我能理解到的就是这个了。。。
    @ttycode 恩恩,是的
    @haofly thrift 总听说过的吧。thriftpy 就是 thrift 的纯 python 实现。
    @Yc1992 哈哈哈,我也这么觉得
    164 天前
    回复了 resolvewang 创建的主题 问与答 aiohttp 怎么复用连接池
    @messense 好的,明白了,感谢
    165 天前
    回复了 resolvewang 创建的主题 问与答 aiohttp 怎么复用连接池
    @messense 我一直以为 teardown 和 setup 在 unnittest.main()中只会运行一遍。。。

    event loop 在程序的整个生命流程中,如果被 close 了,那么就不能使用 asyncio.get_event_loop()获取了吗?根据上面的代码,感觉是这样的。那这也就是说,我们只能在程序不用 event loop 的时候再关吗?

    感觉自己对 event loop 模型还不是特别清楚。
    165 天前
    回复了 resolvewang 创建的主题 问与答 aiohttp 怎么复用连接池
    @messense 感谢您的耐心回复!通过你的回复,我对 asyncio 的理解进了一步,前两天看了差不多一天的文档,都还是有点懵。现在还有两个问题,我还是不是很懂,希望您能再帮忙解一下惑。

    `
    async def select(pool, sql, args=(), size=None):
    async with pool.acquire() as conn:
    async with conn.cursor() as cur:
    await cur.execute(sql.replace('?', '%s'), args)
    if size:
    r = await cur.fetchmany(size)
    else:
    r = await cur.fetchall()
    return r
    `

    我在做关于这段代码的单元测试的时候,虽然执行正确,但是有一个警告,` ResourceWarning: Unclosed connection <aiomysql.connection.Connection object at 0x1030d1710>
    ResourceWarning)`

    大概意思就是数据库连接没有关闭吧。但是这里用了上下文管理器啊,它不应该会关闭连接吗?我如果在 return 语句之前,加上 conn.close(), 就不会报这个警告了。

    `
    def test_select(self):
    sql = 'select * from minifw where id = (%s)'
    rs = self.loop.run_until_complete(base_db.select(self.pool, sql, args=(1,), size=1))
    self.assertEqual(len(rs), 1)
    `
    这段代码是测试 select。


    另外还有一个问题,我想问问
    self.loop = asyncio.new_event_loop()
    asyncio.set_event_loop(self.loop)


    self.loop = asyncio.get_event_loop()
    的区别,因为在我执行 unnittest.main()的时候,用前者就可以执行,用后者就会报错,`Event loop is closed`,如果是测试单个数据库操作,后者就不会报错。

    期望您的回复,感恩
    165 天前
    回复了 resolvewang 创建的主题 问与答 aiohttp 怎么复用连接池
    @messense 大神,是否还有别的方法,可以把 pool 从 main() 中抽出来,这样写我又遇到问题了,比如我要写单元测试用例,应该怎么写啊,我写的运行使用不行

    <pre>
    import asyncio
    import unittest
    import aiomysql
    from minifw.db import base_db


    class TestDB(unittest.TestCase):
    def setUp(self):
    self.loop = asyncio.new_event_loop()
    asyncio.set_event_loop(self.loop)
    self.pool = aiomysql.create_pool(host='127.0.0.1', port=3306,
    user='root', password='123456',
    db='test', loop=self.loop)

    def test_select(self):
    sql = 'select * from minifw where id = (%s)'
    rs = self.loop.run_until_complete(base_db.select(self.pool, sql, args=(1,), size=1))
    self.assertEqual(len(rs), 1)

    def test_insert(self):
    sql = 'insert into `minifw` (`name`) values (?)'
    rs = self.loop.run_until_complete(base_db.insert(self.pool, sql, args=('test_val',)))
    self.assertEqual(rs, 1)

    def tearDown(self):
    self.loop.close()
    del self.loop

    if __name__ == '__main__':
    unittest.main()
    </pre>

    这里的问题就是这个 pool 我不知道咋处理,如果我要运行 unnittest.main(),就会报错 `AttributeError: '_PoolContextManager' object has no attribute 'acquire'`
    165 天前
    回复了 resolvewang 创建的主题 问与答 aiohttp 怎么复用连接池
    @messense 感谢,这样确实是可以的。我咋就没想到。
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   2673 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 62ms · UTC 05:46 · PVG 13:46 · LAX 21:46 · JFK 00:46
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1