我想知道是否有一种干净的方法来在调用函数/方法和被调用的函数/方法之间建立某种通信。比如,调用者是主驱动程序的一部分,它在UI上显示当前的应用程序状态。它需要连接到远程网络节点,为此它调用另一个驻留在另一个Python模块中的方法(在同一个线程中)。
主(驱动程序)模块:
import ssh_client
node_ip = "10.10.10.10"
node_user = "myuser"
node_pass = "mypass"
conn_result = False
while not conn_result :
conn_result = ssh_client.connect(node_ip, node_user, node_pass)
# process custom return codes from connect method here...
ssh_client模块:
import paramiko
def connect(node_ip, node_user, node_pass):
retries_left = 3
while retries_left > 0:
try:
paramiko.SSHClient().connect(node_ip, username=node_user, password=node_pass)
return True
except Exception:
retries_left -= 1
return False
现在,当网络模块方法尝试连接时,它可能会遇到由网络延迟或其他问题引起的各种问题,并会相应地重试连接。此时,我希望该方法以某种方式通知我的主调用方法连接失败并尝试重新连接。
在上面的示例中,我依赖于返回代码来获取当前连接情况。但是,我不想依赖返回代码,而是在连接方法执行时想要数据。换句话说,当有异常时,我希望connect方法告诉驱动程序模块告诉它存在异常并且它试图重新连接。
虽然可以通过粗略的方法来实现这一点,例如将状态更新为文本文件并让调用者轮询状态更改,但这听起来不是一个非常有说服力的解决方案。 Python中有什么东西可以在这里证明方便,我错过了一些明显的东西吗?什么是解决这个问题的好方法?
答案 0 :(得分:0)
一种非常天真的方法是这样的:
from threading import Thread
from Queue import Queue
def connect(queue, *args):
retries_left = 3
while retries_left > 0:
try:
your_connect_call(*args)
except Exception:
queue.put('Error')
retries_left -= 1
# Send poison pill to notify the caller that the task is complete
queue.put(None)
return False
def caller():
q = Queue()
t = Thread(target=connect, args=(q,))
t.start()
while True:
msg = q.get()
if msg is None:
break
print(msg)
res = t.join()
return res
调用者启动一个单独的线程并将Queue
传递给被调用的方法。被调用的方法使用状态通知填充Queue
,调用者可以对此做出反应(这里只是打印这些消息)。被叫方法通过发送None
信号通知呼叫者不再需要消息。调用者等待该信号,然后返回该方法。