code: def test_manager_on_update_rows_with_port_id(self, sentinel):
      s = sentinel(0)
  
      def update_callback(port_id, delta):
          table = Table(delta)
          assert table.size() == 1
          assert table.schema() == {"a": int, "b": str}
          table.delete()
          s.set(s.get() + 1)
  
      # create a table and view using manager
      make_table = {
          "id": 1,
          "name": "table1",
          "cmd": "table",
          "args": [data],
      }
      manager = PerspectiveManager()
      manager._process(make_table, self.post)
      make_view = {
          "id": 2,
          "table_name": "table1",
          "view_name": "view1",
          "cmd": "view",
      }
      manager._process(make_view, self.post)
  
      # Get two ports on the table
      make_port = {
          "id": 3,
          "name": "table1",
          "cmd": "table_method",
          "method": "make_port",
      }
      make_port2 = {
          "id": 4,
          "name": "table1",
          "cmd": "table_method",
          "method": "make_port",
      }
  
      manager._process(make_port, self.post)
      manager._process(make_port2, self.post)
  
      # hook into the created view and pass it the callback
      view = manager._views["view1"]
      view.on_update(update_callback, mode="row")
  
      # call updates
      update1 = {
          "id": 5,
          "name": "table1",
          "cmd": "table_method",
          "method": "update",
          "args": [{"a": [4], "b": ["d"]}, {"port_id": 1}],
      }
      update2 = {
          "id": 6,
          "name": "table1",
          "cmd": "table_method",
          "method": "update",
          "args": [{"a": [5], "b": ["e"]}, {"port_id": 2}],
      }
  
      manager._process(update1, self.post)
      manager._process(update2, self.post)
  
      assert s.get() == 2
  
imports: import json
  import time
  import numpy
  import pyarrow
  from datetime import datetime
  from functools import partial
  from pytest import raises
  from perspective import Table, PerspectiveError, PerspectiveManager
label_desc: Use image node_id 40 for calling the TestPerspectiveManager obj's underlying member method code with example usage: obj.test_manager_on_update_rows_with_port_id(sentinel) without return types