Python开发的Azure Function无法并行处理并发HTTP请求问题咨询
问题排查与修复步骤
- 首先修正客户端并发限制
你使用的.NET Framework中HttpWebRequest默认有全局并发连接数限制,默认值仅为2,哪怕你用Parallel.ForEach发起并行请求,客户端本身就会把请求卡住串行发送,先在C#代码的Main方法最开头添加以下配置,排除客户端侧的并发限制问题:
ServicePointManager.DefaultConnectionLimit = 200;
- 修正host.json的错误配置
- 你之前对
maxConcurrentRequests参数的理解错误:这个参数限制的是单个实例上同时处理的HTTP请求最大数量,你设为1的情况下,单实例同一时间只能处理1个请求,10个测试请求流量太小,不会触发函数应用横向扩容,自然就串行处理了。 - 你贴的host.json存在语法错误,多了多余的闭合括号,导致配置无法正常生效,修正后的参考配置如下:
{ "version": "2.0", "logging": { "applicationInsights": { "samplingSettings": { "isEnabled": true, "excludedTypes": "Request" } } }, "extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle", "version": "[2.*, 3.0.0)" }, "extensions": { "queues": { "batchSize": 1 }, "http": { "routePrefix": "api", "maxOutstandingRequests": 200, "maxConcurrentRequests": 100, "dynamicConcurrencyEnabled": true } } }
把maxConcurrentRequests调整到你期望的单实例并发值,同时开启动态并发配置即可。
确认Python函数代码的并发兼容性
如果你的Python函数用的是同步写法(普通def定义),要确保代码中没有全局锁、共享资源阻塞等逻辑,避免多线程处理时被阻塞。如果是IO密集型的业务逻辑,建议改成async异步写法,能大幅提升并发处理效率。排查扩容触发逻辑
Azure Functions消费计划的横向扩容不是即时触发的,需要有持续的请求积压才会启动新实例,10个请求的测试流量不足以触发多实例扩容,如果你需要验证多实例并行处理的效果,可以把测试请求量提升到100以上并持续发送一段时间,观察是否有新实例启动、并行处理请求。你之前设置的
FUNCTIONS_WORKER_PROCESS_COUNT = 10和PYTHON_THREADPOOL_THREAD_COUNT = 32是生效的,配合调整后的maxConcurrentRequests参数就能在单实例上实现多请求并行处理。
内容的提问来源于stack exchange,提问作者Amit Raz
相关产品推荐
相关产品推荐

