Re: Long gen_server init question (not about order of messages :)
Ali Sabil <[email protected]>
| Newsgroups | gmane.comp.lang.erlang.general |
|---|---|
| Message-ID | <CAFXsykjYqCV3KG9shutiwVaj6XGBpQ4mVJkbDy6geZ4ntziBhg@mail.gmail.com> |
Did you consider changing the overall architecture and use 1 process for each request? On Sun, 16 May 2021 at 07:53, Stanislav Ledenev <[email protected]> wrote: > I know about hanle_continue but my question is not about long init() > function. > To make it simpler it is about long-running functions inside of > handle_continue. > It may be possible to spawn those functions in different processes but it > is not > desirable because of requirements. > > mod_func is quite general (general like a library) and should not know > about > anything specific outside of it. Passing to mod_func something like > 'reply_to' reference > could be possible but it is fragile - response side could be not ready at > the > moment of replying and this *single* notification would just vanish. > So notification from mod_func to mod_api is the same problem but from the > other side. > > вс, 16 мая 2021 г. в 02:50, Leonard B <[email protected]>: > >> Why not notify mod_api from mod_func once it's initialized. If you wanted >> mod_func initialization to be non-blocking you could use handle_continue. >> >> Kind regards, >> Leonard >> >> >> On Sat, May 15, 2021, 14:55 Stanislav Ledenev <[email protected]> >> wrote: >> >>> Hi! >>> Need advice from an experienced community about synchronizing long >>> initializing gen_server with other parts of application. >>> >>> Let's say we have 4 gen_servers: >>> * mod_api - accept requests; >>> * mod_func - real job; >>> * mod_x, mod_y - users of mod_func. >>> >>> mod_api accepts requests and transforms them to calls to mod_x, mod_y. >>> mod_func is crucial for the application but it needs a time consuming >>> procedure >>> of initialization. IRL it is some cryptography related stuff. >>> While mod_func is in the initialization state, mod_api must return >>> 'not_ready' for all requests. >>> While mod_func initializing it is not available for any requests. >>> >>> I was thinking about options of notification mechanism implementation >>> and see two of them: >>> 1. Some kind of polling from mod_api to mod_func with gen_server:call >>> with timeout: mod_api after initialization begin send_after loop with >>> timeout call to mod_func; >>> 2. gen_event based solution. Run up gen_event and wait for notification >>> about readiness of mod_func. >>> >>> Am I missing something? Are there any better solutions for such a task? >>> >>