C++11 另一进程中的安全等待功能
TL;DR 如何在单独的过程中安全地C++11 另一进程中的安全等待功能,c++11,multiprocessing,gunicorn,python-asyncio,locust,C++11,Multiprocessing,Gunicorn,Python Asyncio,Locust,TL;DR 如何在单独的过程中安全地等待函数执行(将str和int作为参数,不需要任何其他上下文) 说来话长 我有aiohtto.webwebapi,它使用Boost.Python为C++扩展包,在gunicorn下运行(我计划将它部署在Heroku上),由蝗虫测试 关于扩展:它只有一个执行非阻塞操作的函数——获取一个字符串(以及一个用于超时管理的整数),使用它执行一些计算并返回一个新字符串。对于每个输入字符串,它只有一个可能的输出(超时除外,但在这种情况下,C++exception必须由Boo
等待函数执行(将str
和int
作为参数,不需要任何其他上下文)
说来话长
我有aiohtto.web
webapi,它使用Boost.Python
为C++
扩展包,在gunicorn
下运行(我计划将它部署在Heroku上),由蝗虫
测试
关于扩展:它只有一个执行非阻塞操作的函数——获取一个字符串(以及一个用于超时管理的整数),使用它执行一些计算并返回一个新字符串。对于每个输入字符串,它只有一个可能的输出(超时除外,但在这种情况下,C++
exception必须由Boost.Python引发并转换为与Python兼容的异常)
简而言之,特定URL的处理程序执行以下代码:
res = await loop.run_in_executor(executor, func, *args)
<> >代码>执行器< /代码>是C++扩展模块的<代码> PraseSoPosialExtor,/Cuff>实例,和 Func < /C> >函数。(在实际项目中,此代码位于类的coroutine方法中,func
-是classmethod
只执行C++
函数并返回结果)
错误捕获
当一个新请求到达时,我通过request.POST()
提取它的POST数据,然后将它的数据存储到名为Call
的自定义类的实例中(因为我不知道如何以另一种方式命名它)。因此,call
对象包含所有输入数据(字符串)、请求接收时间和请求附带的唯一id
然后它进入名为Handler
(不是aiohttp
请求处理程序)的类,该类通过循环将其输入传递给另一个类的方法。但是Handler
有一个日志系统,它的工作原理类似于一个中间件-读取每个传入调用的id和接收时间
对象,并用一条消息记录它,告诉您它刚刚开始执行、成功执行或遇到麻烦。另外,Handler
具有try/except
并将所有错误存储在调用
对象中,以便日志中间件知道发生了什么错误,或者返回了什么输出扩展
测试
我有一个单元测试,它只创建了256个协程,其中包含了这段代码,executor有256个worker,并且运行良好
但是当用蝗虫进行测试时,出现了一个问题。我使用4名Gunicorn工人和4名执行人员进行此类测试。有时,应用程序会开始返回错误的输出
My Occast的任务集
配置为使用所有可用信息记录每个故障响应:输出字符串、错误字符串、输入字符串(也由应用程序返回)、id。所有模拟请求都是相同的,但id
对于每个请求都是唯一的
将Gunicorn的max_requests
选项设置为100
requests时,情况会更好,但仍然会出现故障
有趣的是,有时我可以通过简单地停止和启动蝗虫测试来触发“错误输出”期
我需要一个100%的保证,我的网络API的工作,因为我期望
更新和解决方案
只是要求我的同事复习C++代码——问题是在<强>全局变量< /强>中。从某种意义上说,256个并行协同程序并没有问题,但Gunicorn却有问题。
我不知道为什么要标记它。基本上,听起来您的web服务没有伸缩性?@enderland scalabling没有必要从web API获得预期的输出。我在上一次编辑中添加了关于蝗虫测试的注释。您是否记录了run_in_executor的结果以确保问题与C代码相关?目前尚不清楚应用程序返回的“错误输出”是什么。可能是服务器无法处理这个并行请求,不管执行者的东西。@ GelasimoMikmikHiC++代码进行计算,例如,如果它做算术运算而不是“2 + 2”输入字符串,它必须返回“4”每一个。蝗虫测试可以发送数百个带有“2+2”的请求,所以我希望每个响应都必须是“4”,但事实并非如此。我已经更新了关于日志和类似解决方案的信息。我应该重新命名这个问题吗?