如何解决视图等待SSH编译的问题

2024-09-21 00:51:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的观点:

def test(request):
 os.system('fab remote_uname -i /path/to/keyfile -H hostname')
 return HttpResposnse('Complete')

fabfile.py中:

from fabric.api import *
env.user='ubuntu'
def remote_uname():
 run('uname -a')

当我点击url时,它会等待很长时间来传递响应。这可能会混淆用户再次点击刷新执行remote_uname()。如何传递视图并让操作稍后完成? 在这种情况下,如何实现并发性?你知道吗


Tags: topathtestreturnremoteosrequestdef
2条回答

对于简单的情况,您可以使用线程,但是您必须在交付视图之后处理失败。这可能有点棘手,你对返回值感兴趣吗?你知道吗

def ssh_connect():
 os.system('fab remote_uname -i /path/to/keyfile -H hostname')    

def test(request):
 threading.Thread(target=ssh_connect, args=()).start()
 return HttpResposnse('Complete')

线程/进程并发可能需要抛出

您有几个选项,比如线程/进程级别的并发性,例如使用Python的^{}模块。但走这条路,我担心你可能会暴露出比你的硬件所能处理的更多的线程/进程,除非你限制你的Django视图或其他限制速度的东西。你知道吗

它完成了任务,非常简单,您的视图将立即返回,但您可能会面临过载的风险,您需要手动管理结果和错误。你知道吗

任务队列

否则,您可以将其实现为队列任务,如Celery*例如。, 它将对任务进行排队,逐个或按您设置的并发级别运行它们。另一个优点是在成功的情况下会产生结果,并且会记录失败,因此如果您愿意,可以将它们返回给用户。你知道吗

*像芹菜这样的任务队列在设置时可能看起来很复杂,但事实并非如此,而且在Django内部也有可靠的支持。

相关问题 更多 >

    热门问题