我们每 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)()
我们还使用自动缩放,最小辅助角色 = 2,最大 = 10。我注意到我们偶尔会达到 SQL 最大连接数。我们的 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 只股票时,我们达到最大连接数限制?我对分组有些不了解。我们如何避免这个问题,简单地提高最大连接数,或降低每个任务的库存?
假设,您的机器有 8 个内核。启动工作线程时,默认情况下它会启动 8 个进程来使用任务。
在您的情况下,每 8 个流程和 100 个库存最多 10 名工作人员将计为 8000。
可以查看并发性并对其进行限制,也可以增加数据库连接或减少每秒查询的股票数。