Изящное закрытие асинсио -коратокPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Изящное закрытие асинсио -кораток

Сообщение Anonymous »

В настоящее время у меня возникают проблемы с закрытием асинсиоров во время выключения Ctrl-C приложения. Следующий код - это урезанная версия того, что у меня есть сейчас: < /p>

Код: Выделить всё

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import asyncio
import time
import functools
import signal

class DummyProtocol(asyncio.Protocol):

def __init__(self, *args, **kwargs):
self._shutdown = asyncio.Event()
self._response = asyncio.Queue(maxsize=1)
super().__init__(*args, **kwargs)

def connection_made(self, transport):
self.transport = transport

def close(self):
print("Closing protocol")
self._shutdown.set()

def data_received(self, data):

#data = b'OK MPD '

# Start listening for commands after a successful handshake
if data.startswith(b'OK MPD '):
print("Ready for sending commands")
self._proxy_task = asyncio.ensure_future(self._send_commands())
return

# saving response for later consumption in self._send_commands
self._response.put_nowait(data)

async def _send_commands(self):

while not self._shutdown.is_set():

print("Waiting for commands coming in ...")

command = None

# listen for commands coming in from the global command queue. Only blocking 1sec.
try:
command = await asyncio.wait_for(cmd_queue.get(), timeout=1)
except asyncio.TimeoutError:
continue

# sending the command over the pipe
self.transport.write(command)

# waiting for the response. Blocking until response is complete.
res = await self._response.get()
# put it into the global response queue
res_queue.put_nowait(res)

async def connect(loop):
c = lambda: DummyProtocol()
t = asyncio.Task(loop.create_connection(c, '192.168.1.143', '6600'))
try:
# Wait for 3 seconds, then raise TimeoutError
trans, proto = await asyncio.wait_for(t, timeout=3)
print("Connected to .")
return proto
except (asyncio.TimeoutError, OSError) as e:
print("Could not connect to .  Trying again ...")
if isinstance(e, OSError):
log.exception(e)

def shutdown(proto, loop):
# http://stackoverflow.com/a/30766124/1230358
print("Shutdown of DummyProtocol initialized ...")
proto.close()
# give the coros time to finish
time.sleep(2)

# cancel all other tasks
# for task in asyncio.Task.all_tasks():
#    task.cancel()

# stopping the event loop
if loop:
print("Stopping event loop ...")
loop.stop()

print("Shutdown complete ...")

if __name__ == "__main__":

loop = asyncio.get_event_loop()

cmd_queue = asyncio.Queue()
res_queue = asyncio.Queue()

dummy_proto = loop.run_until_complete(connect(loop))

for signame in ('SIGINT','SIGTERM'):
loop.add_signal_handler(getattr(signal, signame), functools.partial(shutdown, dummy_proto, loop))

try:
loop.run_forever()
except KeyboardInterrupt:
pass
finally:
loop.close()
< /code>

Что дает мне следующий выход, если нажат Ctrl-C: < /p>

Connected to .
Ready for sending commands
Waiting for commands coming in ...
Waiting for commands coming in ...
Waiting for commands coming in ...
Waiting for commands coming in ...
^CShutdown of DummyProtocol initialized ...
Closing protocol
Stopping event loop ...
Shutdown complete ...
Task was destroyed but it is pending!
task: 
Task was destroyed but it is pending!
task: 
Exception ignored in: 
Traceback (most recent call last):
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/queues.py", line 170, in get
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/futures.py", line 227, in cancel
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/futures.py", line 242, in _schedule_callbacks
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/base_events.py", line 447, in call_soon
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/base_events.py", line 456, in _call_soon
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/base_events.py", line 284, in _check_closed
RuntimeError: Event loop is closed
< /code>

Я не очень опытен с асинсио, поэтому я почти уверен, что упускаю что -то важное здесь. Что действительно дает мне головную боль, так это часть вывода после завершения выключения ... 
. Начиная с задания было уничтожено, но это ожидает! , я должен признать, что понятия не имею, что происходит. Я посмотрел на другие вопросы, но не мог заставить его работать. Итак, почему этот код выводит такие вещи, как задание, было уничтожено, но это ожидает! ASO. и как очистить Close Couroutines?

Спасибо за вашу помощь!

Подробнее здесь: https://stackoverflow.com/questions/374 ... coroutines
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Изящное закрытие асинсио -кораток
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Изящное закрытие асинсио -кораток
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Как мне создать плановые задачи асинсио, безопасные для асинсио?
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Как мне создать плановые задачи асинсио, безопасные для асинсио?
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Как мне создать плановые задачи асинсио, безопасные для асинсио?
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»