【发布时间】:2015-05-28 20:08:17
【问题描述】:
我尝试在 asyncssh 上自动重新连接 ssh 客户端。 (SshConnectManager 必须留在后台并在需要时进行 ssh 会话)
class SshConnectManager(object):
def __init__(self, host, username, password, port=22):
self._host = host
self._username = username
self._password = password
self._port = port
self.conn = None
asyncio.async(self.start_connection)
@asyncio.coroutine
def start_connection(self):
try:
Client = self._create_ssh_client()
self.conn, _ = yield from asyncssh.create_connection(Client,
self._host, port=self._port,
username=self._username,
password=self._password)
except Exception as e:
print("Connection error! {}".format(e))
asyncio.async(self.start_connection())
def _create_ssh_client(self):
class MySSHClient(asyncssh.SSHClient):
parent = self
def connection_lost(self, exc):
self.parent._handle_connection_lost(exc)
return MySSHClient
def _handle_connection_lost(self, exc):
print('Connection lost on {}'.format(self.host))
print(exc)
asyncio.async(self.start_connection)
ssh1 = SshConnectManager(settings.host, settings.username, settings.password, settings.port)
asyncio.get_event_loop().run_until_complete(...)
请不要看 _create_ssh_client 或其他“haks”
问题是:
$ python3 main.py
Traceback (most recent call last):
File "main.py", line 75, in <module>
ssh1 = SshConnectManager(settings.host, settings.username, settings.password, settings.port)
File "main.py", line 22, in __init__
asyncio.async(self.start_connection)
File "/usr/lib/python3.4/asyncio/tasks.py", line 565, in async
raise TypeError('A Future or coroutine is required')
TypeError: A Future or coroutine is required
但是 self.start_connection 是协程的!或不? 或者从同步代码启动异步任务的另一种方式是什么?
【问题讨论】:
-
你看过
/usr/lib/python3.4/asyncio/tasks.py的第565行了吗? -
是的。但是为什么 start_connection 不是协程的呢?
-
哦。需要调用它来获取 corutine...
-
@kolko 看起来你已经知道你需要做
asyncio.async(self.start_connection())(缺少尾括号)。您在代码的其他地方也正确地做到了,所以我假设这只是一个错字? -
这不是错字:) 我错了。并且忘记在调试时尝试添加括号。
标签: python python-asyncio