code: def test_ports_multiple_tables_with_different_ports(self):
      server = Table(data)
      client = Table(data)
  
      for i in range(random.randint(5, 15)):
          # reserve an arbitary number of ports
          server.make_port()
  
      # port for client is now far above the ports "ON" the client, as the
      # client ports will begin creation at 1.
      server_port_for_client = server.make_port()
      client_port = client.make_port()
  
      server_view = server.view()
      client_view = client.view()
  
      # when the client updates, check whether the port id matches that
      # of the server, and complete the test.
      def client_callback(port_id, delta):
          if port_id == client_port:
              print("UPDATING SERVER")
              server.update(delta, port_id=server_port_for_client)
  
      # when the server updates, pass the update back to the client
      def server_callback(port_id, delta):
          print("UPDATING CLIENT")
          assert port_id == server_port_for_client
          assert server.size() == 8
          server_view.delete()
          server.delete()
          client_view.delete()
          client.delete()
  
      client_view.on_update(client_callback, mode="row")
      server_view.on_update(server_callback, mode="row")
  
      client.update(data, port_id=client_port)
  
file_path: perspective/python/perspective/perspective/tests/table/test_ports.py
imports: import random
  from perspective.table import Table
label_desc: Use image node_id 7 for calling the TestPorts obj's underlying member method code with example usage: obj.test_ports_multiple_tables_with_different_ports() without return types