How to trigger some rpc entrypoints when service is started?

I want to call several rpc entrypoints when my service is started. My solution is below. But it has fault.

def main():
    runner = create_service_runner(cfg['nameko'])
    runner.start()

    if not on_service_start(cfg['nameko']):
        raise RuntimeError('Failed to setup service.')
    runner.wait()

def on_service_start(cfg) -> bool:
    with ServiceRpcProxy('my_service', cfg['nameko'], timeout=5 * 60) as rpc:
        return rpc.init1() and rpc.init2()

eventlet blames below. Furthermore, if my_service is deployed in a cluster, it cannot guarantee all nodes get correct amount of rpc requests.

nameko.exceptions.RemoteError: RuntimeError Second simultaneous read on fileno 6 detected. Unless you really know what you’re doing, make sure that only one greenthread can read any particular socket. Consider using a pools.Pool. If you do know what you’re doing and want to disable this error, call eventlet.debug.hub_prevent_multiple_readers(False) - MY THREAD=<built-in method switch of GreenThread object at 0x7f477efa8c00>; THAT THREAD=FdListener(‘read’, 6, <built-in method switch of GreenThread object at 0x7f478016e470>, <built-in method throw of GreenThread object at 0x7f478016e470>)

Is there a better way to call ‘my_service’ entrypoint in ‘my_service’ project itself?

I do it like this:

from nameko.extensions import Entrypoint

class Start(Entrypoint):

    def start(self):
        self.container.spawn_worker(self, (), {})

on_start = Start.decorator


class OdooService:
    name = 'odoo'

    @on_start
    def on_service_start(self):
        logger.debug('Odoo service start.')
1 Like