Re: Long gen_server init question (not about order of messages :)
Stanislav Ledenev <[email protected]>
| Newsgroups | gmane.comp.lang.erlang.general |
|---|---|
| Message-ID | <CAOkK=AKLotCHKrxhSjKt9A6=FLN5b2J3aawyD8rkpeGZKKoKzA@mail.gmail.com> |
> > Did you consider changing the overall architecture and use 1 process for > each request? What part of my message made you think that I have any kind of problems with load balancing or something similar? I have not. In general all I need is a method of notification between multiple gen_server's about their readiness to do some work. And this is not about init callback. It is about their inner process of initialization. For example, some specific kinds of cryptography require a lot of calculations and user interactions for these calculations made possible. вс, 16 мая 2021 г. в 12:57, Ali Sabil <[email protected]>: > 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? >>>> >>>