C++11 另一进程中的安全等待功能

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

TL;DR

如何在单独的过程中安全地
等待函数执行(将
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”,但事实并非如此。我已经更新了关于日志和类似解决方案的信息。我应该重新命名这个问题吗?