我们每隔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个股票时达到最大连接限制?我不了解有关分组的事情。我们如何避免这个问题,只需提高最大连接数,或降低每个任务的库存量?
答案 0 :(得分:0)
让我们说,你的机器有8个核心。当您启动一个worker时,默认情况下它启动8个进程来使用任务。
在您的情况下,每8个流程最多10个工人,100个库存将计为8000个。
可能您可以查看并发性并限制它,或者您可以增加数据库连接或减少每秒查询的库存数量。