code: def test_async_queue_process_multiple_ports(self):
      tbl = Table({"a": int, "b": float, "c": str})
      port_ids = [0]
      port_data = [{"a": 0, "b": 0, "c": "0"}]
  
      for i in range(10):
          port_id = tbl.make_port()
          port_ids.append(port_id)
          port_data.append(
              {"a": port_id, "b": port_id * 1.5, "c": str(port_id)}
          )
  
      assert port_ids == list(range(0, 11))
      manager = PerspectiveManager()
      manager.host(tbl)
      manager.set_loop_callback(TestAsync.loop.add_callback)
  
      assert syncify(lambda: tbl.size())() == 0
  
      random.shuffle(port_ids)
  
      @syncify
      def _tbl_task():
          for port_id in port_ids:
              idx = (
                  port_id
                  if port_id < len(port_ids)
                  else len(port_ids) - 1
              )
              tbl.update([port_data[idx]], port_id=port_id)
          size = tbl.size()
          tbl.delete()
          return size
  
      assert len(port_ids) == 11
      assert _tbl_task() == 11
  
imports: import queue
  import random
  import threading
  from functools import partial
  import tornado.ioloop
  from perspective import PerspectiveError, PerspectiveManager, Table
  from pytest import raises
label_desc: Use image node_id 12 for calling the TestAsync obj's underlying member method code with example usage: obj.test_async_queue_process_multiple_ports() and returns: size