首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Asyncpg池等待所有结果

Asyncpg池等待所有结果
EN

Stack Overflow用户
提问于 2020-10-06 12:45:15
回答 2查看 676关注 0票数 0

我使用异步板进行大量的查询,计算时间通常在15-20秒左右。我在实验一个最小和最大的游泳池,发现了一种奇怪的行为。当我试图发出多个请求时,它们会同时执行,但结果会在一个批处理中返回。批处理始终与池大小相同。这种行为会导致长时间的第一次反应,大约50秒左右。第一批之后,我需要再等50秒,才能得到其他结果。看起来异步to等待收集池中的所有结果并返回它们,而不是在结果准备好后立即返回。

是否有一种方法可以在单个请求执行后立即获得结果?也许是我错过的环境?

有一段时间,我可以保持25个连接,但这似乎是一个黑客,这是我真的不喜欢。

如果这很重要,我会使用DSN创建一个池。

代码语言:javascript
复制
db_pool = await asyncpg.create_pool(loop=self._loop, **params)

下面是我用来向DB发出请求的代码:

代码语言:javascript
复制
    async def first(self, query: str, values: List, db_name: str = 'default'):
        pool = self.get_pool(db_name)

        async with pool.acquire() as conn:
            return await conn.fetchrow(query, *values)

现在,我正在测试默认池大小(10最大,10分钟),同时发送25个请求。

代码语言:javascript
复制
result for 336997:  45.43796348571777 s
result for 368406:  45.43796348571777 s
result for 288307:  45.81912803649902 s
result for 283236:  46.499717235565186 s
result for 296000:  49.140310764312744 s
result for 304671:  49.20531177520752 s
result for 283685:  49.26837992668152 s
result for 283772:  49.3363881111145 s
result for 283720:  49.3753764629364 s
result for 294811:  49.39737892150879 s
result for 325604:  112.60201215744019 s
result for 336997:  112.60101222991943 s
result for 283028:  112.62509346008301 s
result for 291122:  113.41229104995728 s
result for 281105:  115.48561716079712 s
result for 304874:  115.59060764312744 s
result for 281875:  115.73372554779053 s
result for 283219:  115.73472547531128 s
result for 312094:  116.00303101539612 s
result for 312094:  116.0290174484253 s
result for 368406:  157.77449679374695 s
result for 325604:  157.77449679374695 s
result for 281932:  157.79654741287231 s
result for 290687:  157.79554748535156 s
result for 304874:  158.38678884506226 s

如果我将最大值和最小值设为25,当我得到以下结果时:

代码语言:javascript
复制
result for 368406:  96.23042106628418 s
result for 368406:  96.22842144966125 s
result for 283236:  97.59920930862427 s
result for 304671:  99.69211030006409 s
result for 281932:  107.54676508903503 s
result for 283685:  107.95523738861084 s
result for 281875:  108.28549408912659 s
result for 283720:  108.39060115814209 s
result for 283028:  108.388601064682 s
result for 296000:  108.44459056854248 s
result for 283772:  108.55759739875793 s
result for 291122:  108.59360837936401 s
result for 294811:  108.90663266181946 s
result for 336997:  109.07162356376648 s
result for 325604:  109.07562470436096 s
result for 325604:  109.17762279510498 s
result for 336997:  109.30463767051697 s
result for 312094:  109.40563464164734 s
result for 312094:  109.40663456916809 s
result for 281105:  109.63970899581909 s
result for 290687:  109.66070008277893 s
result for 304874:  109.66170001029968 s
result for 288307:  109.68773555755615 s
result for 304874:  109.68273568153381 s
result for 283219:  109.68573522567749 s

5/5连接会带来可怕的结果

代码语言:javascript
复制
result for 288307:  38.87580060958862 s
result for 325604:  38.87280225753784 s
result for 283219:  38.87380290031433 s
result for 283772:  38.98385691642761 s
result for 304671:  39.80011057853699 s
result for 368406:  94.94180464744568 s
result for 283720:  94.94180464744568 s
result for 296000:  94.98080492019653 s
result for 294811:  95.45388603210449 s
result for 283685:  95.85135459899902 s
result for 291122:  156.6862394809723 s
result for 325604:  156.68523907661438 s
result for 336997:  156.68724012374878 s
result for 304874:  156.8772156238556 s
result for 283236:  157.72206735610962 s
result for 336997:  219.94082736968994 s
result for 368406:  219.96384191513062 s
result for 312094:  220.39882922172546 s
result for 281105:  220.8170771598816 s
result for 283028:  221.18352794647217 s
result for 290687:  283.105571269989 s
result for 281932:  283.10657024383545 s
result for 304874:  283.105571269989 s
result for 281875:  283.21556425094604 s
result for 312094:  283.7060844898224 s
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-01 16:10:02

这是DB方面的一个问题,我们必须增加资源来解决这个问题。

票数 0
EN

Stack Overflow用户

发布于 2020-10-06 17:29:38

每个查询只在等待自己的结果。如果所有查询的工作量都是相同的,那么它们(实际上正在运行的查询)都是在大约相同的时间之后完成的。而且也不是那么相似,从45.4到49.4的差距并不是微不足道的。如果它是有意地同步它们,您会认为它会做得更好。

有一段时间我可以保持25个连接,但它似乎是一个黑客,这是我真的不喜欢。

你宁愿做什么呢?用低一点的号码?更高的?一个随机数,每分钟都在变化?您应该对连接池设置一个限制。为什么25会是一个黑客,但其他一些数字不会是?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64226086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档