Python Правильный способ использования асинхронных потоков для открытия соединения, отправки и получения нескольких передач, а затем изящного закрытия соединения - PullRequest
0 голосов
/ 12 марта 2020

Я спрашиваю, где либо мой процесс-хотя, либо мой код неверен относительно использования клиентских потоков asyncio для отправки данных и получения ответов от сервера. Когда я вызываю метод, который отключает клиента, выдается исключение. Я изучаю python asyncio и столкнулся с исключениями во время тестирования, пытаясь закрыть клиентское соединение. Я пытаюсь 1). Создайте соединение клиента с сервером 2). оставьте клиентское соединение открытым, чтобы его можно было использовать в нескольких циклах отправки / получения 3). после завершения корректно закройте клиентское соединение.

Это класс, содержащий методы asyncio для создания средства записи потока.

  class hl7_client_sender:
      SB = b'\x1B'
      EB = b'\x1C'
      CR = b'\x0D'

      def __init__(self,address,port,timeout=-1,retry=3.0):
          self._resend=0
          self._timeout= timeout
          self._retry = retry
          #self._reader, self._writer = await asyncio.open_connection(address,port)
          self._address = address
          self._port = port
          self._writer = None
          self._reader = None

async def connect(self):
    self._reader, self._writer = await asyncio.open_connection(self._address,self._port)

async def disconnect(self):
    await self._writer.wait_closed()

, и это код в моем драйвере, где происходит исключение во время вызова для отключения

  #test send and respond
  import asyncio
  import string
  import unicodedata
  import simple_hl7_client
  import time
  ##open a connectino sleep 5 seconds then close###
  myclient = simple_hl7_client.hl7_client_sender('192.168.226.128',54321)
  asyncio.run(myclient.connect())
  time.sleep(3)
  asyncio.run(myclient.disconnect())

Исключение возникает во время вызова asycnio.run (myclient.disconnect ())

Это исключение:

      Traceback (most recent call last):
        File ".\test_simple_hl7_client.py", line 11, in <module>
   asyncio.run(myclient.disconnect())
   File "C:\Users\billg\AppData\Local\Programs\Python\Python37\lib\asyncio\runners.py",           line 43, in run
      return loop.run_until_complete(main)
    File "C:\Users\billg\AppData\Local\Programs\Python\Python37\lib\asyncio\base_events.py", line 583, in run_until_complete
      return future.result()
    File "D:\data\FromOldPC\code\ASYNCIOTESTING\simple_hl7_client.py", line 23, in disconnect
      self._writer.close()
    File "C:\Users\billg\AppData\Local\Programs\Python\Python37\lib\asyncio\streams.py", line 317, in close
      return self._transport.close()
    File "C:\Users\billg\AppData\Local\Programs\Python\Python37\lib\asyncio\selector_events.py", line 663, in close
      self._loop.call_soon(self._call_connection_lost, None)
    File "C:\Users\billg\AppData\Local\Programs\Python\Python37\lib\asyncio\base_events.py", line 687, in call_soon
      self._check_closed()
    File "C:\Users\billg\AppData\Local\Programs\Python\Python37\lib\asyncio\base_events.py", line 479, in _check_closed
      raise RuntimeError('Event loop is closed')
  RuntimeError: Event loop is closed
...