code: def start_bipartite_etype_sample_client(
      rank, tmpdir, disable_shared_mem, fanout=3, nodes={}
  ):
      gpb = None
      if disable_shared_mem:
          _, _, _, gpb, _, _, _ = load_partition(
              tmpdir / "test_sampling.json", rank
          )
      dgl.distributed.initialize("rpc_ip_config.txt")
      dist_graph = DistGraph("test_sampling", gpb=gpb)
      assert "feat" in dist_graph.nodes["user"].data
      assert "feat" in dist_graph.nodes["game"].data
  
      if dist_graph.local_partition is not None:
          # Check whether etypes are sorted in dist_graph
          local_g = dist_graph.local_partition
          local_nids = np.arange(local_g.num_nodes())
          for lnid in local_nids:
              leids = local_g.in_edges(lnid, form="eid")
              letids = F.asnumpy(local_g.edata[dgl.ETYPE][leids])
              _, idices = np.unique(letids, return_index=True)
              assert np.all(idices[:-1] <= idices[1:])
  
      if gpb is None:
          gpb = dist_graph.get_partition_book()
      sampled_graph = sample_etype_neighbors(dist_graph, nodes, fanout)
      block = dgl.to_block(sampled_graph, nodes)
      if sampled_graph.num_edges() > 0:
          block.edata[dgl.EID] = sampled_graph.edata[dgl.EID]
      dgl.distributed.exit_client()
      return block, gpb
  
imports: import multiprocessing
  import os
  import random
  import sys
  import time
  import traceback
  import unittest
  from pathlib import Path
  import backend
  import dgl
  import numpy
  import pytest
  from dgl.data import CitationGraphDataset, WN18Dataset
  from dgl.distributed import DistGraph, DistGraphServer, load_partition, load_partition_book, partition_graph, sample_etype_neighbors, sample_neighbors
  from scipy import sparse
  from utils import generate_ip_config, reset_envs
label_desc: Use image node_id 24 for calling a global function with example usage: start_bipartite_etype_sample_client(rank, tmpdir, disable_shared_mem, fanout, nodes) and returns: block,  gpb