def data_provider_server(lock, conn): """The PyGRASS data provider server designed to be a target for multiprocessing.Process :param lock: A multiprocessing.Lock :param conn: A multiprocessing.Pipe """ def error_handler(data): """This function will be called in case of a fatal error in libgis""" # sys.stderr.write("Error handler was called\n") # We send an exception that will be handled in # the parent process, then close the pipe # and release any possible lock conn.send( FatalError("G_fatal_error() was called in the server process")) conn.close() lock.release() CALLBACK = CFUNCTYPE(c_void_p, c_void_p) CALLBACK.restype = c_void_p CALLBACK.argtypes = c_void_p cerror_handler = CALLBACK(error_handler) libgis.G_add_error_handler(cerror_handler, None) # Crerate the function array functions = [0] * 15 functions[RPCDefs.GET_VECTOR_TABLE_AS_DICT] = _get_vector_table_as_dict functions[ RPCDefs.GET_VECTOR_FEATURES_AS_WKB] = _get_vector_features_as_wkb_list functions[RPCDefs.GET_RASTER_IMAGE_AS_NP] = _get_raster_image_as_np functions[RPCDefs.STOP] = _stop functions[RPCDefs.G_FATAL_ERROR] = _fatal_error while True: # Avoid busy waiting conn.poll(None) data = conn.recv() lock.acquire() functions[data[0]](lock, conn, data) lock.release()