c++11 - Safe await on function in another process -


tl;dr

how safely await on function execution (takes str , int arguments , doesn't require other context) in separate process?

long story

i have aiohtto.web web api uses boost.python wrapper c++ extension, run under gunicorn (and plan deploy on heroku), tested locust.

about extension: have 1 function non-blocking operation - takes 1 string (and 1 integer timeout management), calculations , returns new string. , every input string, 1 possible output (except timeout, in case, c++ exception must raised , translated boost.python python-compatible one).

in short, handler specific url executes code below:

res = await loop.run_in_executor(executor, func, *args) 

where executor processpoolexecutor instance, , func -function c++ extension module. (in real project, code in coroutine method of class, , func - it's classmethod executes c++ function , returns result)

error catching

when new request arrives, extract it's post data request.post() , storing it's data instance of custom class named call (because have no idea how name in way). call object contains input data (string), request receiving time , unique id comes request.

then proceeds class named handler (not aiohttp request handler), passes it's input class' method loop.run_in_executor inside. handler has logging system works middleware - reads id , receiving time of every incoming call object , logging message tells either starting execute, executed or in trouble. also, handler have try/except , stores errors inside call object, logging middleware knows error occurred, or output extension had returned

testing

i have unit test creates 256 coroutines code inside , executor have 256 workers , works well.

but when testing locust here comes problem. use 4 gunicorn workers , 4 executor workers kind of testing. @ time application starts return wrong output.

my locust's taskset configured log every fault response available information: output string, error string, input string (that returned application too), id. simulated requests same, id unique every.

the situation better when setting gunicorn's max_requests option 100 requests, failures still come.

interesting thing is, can trigger "wrong output" period stopping , starting locust's test.

i need 100% guarantee web api works expect.

update & solution

just asked teammate review c++ code - problem in global variables. in way, wasn't problem 256 parallel coroutines, gunicorn was.


Comments

Popular posts from this blog

node.js - Node js - Trying to send POST request, but it is not loading javascript content -

javascript - Replicate keyboard event with html button -

javascript - Web audio api 5.1 surround example not working in firefox -