Exemple #1
0
    async def start_worker(self, index):
        self.log.info('Start block loader worker %s' % index)
        # prepare pipes for communications
        in_reader, in_writer = os.pipe()
        out_reader, out_writer = os.pipe()
        in_reader, out_reader = os.fdopen(in_reader,
                                          'rb'), os.fdopen(out_reader, 'rb')
        in_writer, out_writer = os.fdopen(in_writer,
                                          'wb'), os.fdopen(out_writer, 'wb')

        # create new process
        worker = Process(target=Worker,
                         args=(index, in_reader, in_writer, out_reader,
                               out_writer, self.rpc_url, self.rpc_timeout,
                               self.rpc_batch_limit, self.dsn,
                               self.parent.app_proc_title))
        worker.start()
        in_reader.close()
        out_writer.close()
        # get stream reader
        worker.reader = await self.get_pipe_reader(out_reader)
        worker.writer = await self.get_pipe_writer(in_writer)
        worker.name = str(index)
        self.worker[index] = worker
        self.worker_busy[index] = False
        # start message loop
        self.loop.create_task(self.message_loop(index))
        # wait if process crash
        await self.loop.run_in_executor(None, worker.join)
        del self.worker[index]
        self.log.info('Block loader worker %s is stopped' % index)