Django 中的 Fabric。如何解决等待 SSH 完成的视图
Fabric in Django .How to solve view waiting for SSH to complete
我有一个简单的看法:
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()
。我如何传递视图并让操作稍后完成?
在这种情况下如何实现并发?
对于简单的情况,您可以使用线程,但是您必须在交付视图后处理失败。这可能有点棘手,您对 return 值感兴趣吗?
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')
Threads/processes 并发性可能需要限制
您有多种选择,例如 thread/process 级别的并发,例如使用 Python 的 multiprocessing
模块。但是走这条路我担心你可能会接触到比你的硬件可以处理的更多的产卵threads/processes,除非你限制你的 Django 视图或其他限制速率的东西。
它完成了工作,非常简单,您的视图将立即 return,但您有超载的风险,并且您手动管理结果和错误。
任务队列
否则,您可以将其实现为排队任务,如 Celery* 例如,
这将对任务进行排队,运行 一个接一个或按照您设置的并发级别对它们进行排队。另一个优点是成功时的结果,失败会被记录下来,因此您可以 return 如果您愿意,可以将它们返回给用户。
* 像 Celery 这样的任务队列设置起来可能看起来很复杂,但实际上并不复杂,而且在 Django 中也有可靠的支持。
我有一个简单的看法:
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()
。我如何传递视图并让操作稍后完成?
在这种情况下如何实现并发?
对于简单的情况,您可以使用线程,但是您必须在交付视图后处理失败。这可能有点棘手,您对 return 值感兴趣吗?
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')
Threads/processes 并发性可能需要限制
您有多种选择,例如 thread/process 级别的并发,例如使用 Python 的 multiprocessing
模块。但是走这条路我担心你可能会接触到比你的硬件可以处理的更多的产卵threads/processes,除非你限制你的 Django 视图或其他限制速率的东西。
它完成了工作,非常简单,您的视图将立即 return,但您有超载的风险,并且您手动管理结果和错误。
任务队列
否则,您可以将其实现为排队任务,如 Celery* 例如, 这将对任务进行排队,运行 一个接一个或按照您设置的并发级别对它们进行排队。另一个优点是成功时的结果,失败会被记录下来,因此您可以 return 如果您愿意,可以将它们返回给用户。
* 像 Celery 这样的任务队列设置起来可能看起来很复杂,但实际上并不复杂,而且在 Django 中也有可靠的支持。