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)