mySQL最大连接与Celery中的组处理

时间:2015-04-27 19:15:24

标签: python django celery

我们每隔15分钟由芹菜运行一次任务,更新我们的数据库中的股票价格。大约有8000种库存,所以我们在芹菜中使用分组来并行运行。每个任务处理100个股票。

    stock_ids = Stock.objects.values_list('id', flat=True)
    stock_chunks = [stock_ids[x:x + 100] for x in xrange(0, len(stock_ids), 100)]
    group(celery_get_update_stock_chunk_snap_quotes.s(stock_chunk) for stock_chunk in stock_chunks)()

我们还使用自动缩放,最小worker = 2,max = 10。我注意到我们偶尔会遇到SQL max连接。我们的SQL实例设置为默认值150并发。

 File "/usr/local/lib/python2.7/site-packages/MySQLdb/connections.py", line 187, in __init__
super(Connection, self).__init__(*args, **kwargs2)
OperationalError: (1040, 'Too many connections')

为什么我们在每个任务查询100个股票时达到最大连接限制?我不了解有关分组的事情。我们如何避免这个问题,只需提高最大连接数,或降低每个任务的库存量?

1 个答案:

答案 0 :(得分:0)

让我们说,你的机器有8个核心。当您启动一个worker时,默认情况下它启动8个进程来使用任务。

在您的情况下,每8个流程最多10个工人,100个库存将计为8000个。

可能您可以查看并发性并限制它,或者您可以增加数据库连接或减少每秒查询的库存数量。