当前位置: 首页 > 面试题库 >

Django中的线程无法在生产环境中使用

乜飞航
2023-03-14
问题内容

我的Django views.py中有一个类似这样的函数。

def process(request):
form = ProcessForm(request.POST, request.FILES)
if form.is_valid():
    instance = form.save(commit=False)
    instance.requested_by = request.user
    instance.save()
    t = threading.Thread(target=utils.background_match, args=(instance,), kwargs={})
    t.setDaemon(True)
    t.start()
    return HttpResponseRedirect(reverse('mart:processing'))

在这里,我试图在提交ProcessForm时在单独的线程中调用函数“
background_match”。由于此线程需要一些时间才能完成,因此我将用户重定向到另一个名为“ mart:processing”的页面。

我面临的问题是,它们在我的本地计算机上都可以正常运行,但在作为AWS
EC2实例的生产服务器上却无法正常工作。线程根本不会启动。在background_match函数内部有一个for循环,不会向前移动。

但是,如果刷新(CTRL + R)“
mart:processing”页面,它会移动1或2次迭代。因此,要运行一个包含1000个迭代的完整循环,我需要刷新页面1000次。例如,如果经过100次迭代,我不刷新页面,则该页面将停留在该位置,并且不会移至第101次迭代。请帮忙!


问题答案:

错误的架构。Django和其他网络应用程序应生成此类线程。正确的方法是使用任务队列创建异步任务。django最受欢迎的任务队列恰巧是Celery。

然后mart:processing页面应检查异步结果,以确定任务是否已完成。粗略的草图如下。

from celery.result import AsynResult
from myapp.tasks import my_task

...
if form.is_valid():
    ...
    task_id = my_task()
    request.session['task_id']=task_id
    return HttpResponseRedirect(reverse('mart:processing'))
    ...

在下一页

task_id = request.session.get('task_id')
if task_id:
    task = AsyncResult(task_id)


 类似资料:
  • 问题内容: 我正在使用IdentityServer4和来自ASP.NET Core 3.0的React启动项目。预览4,它可以完美工作,直到构建解决方案并尝试使用dotnet命令从cmd提示符运行它为止。每次我启动应用程序时,它都会告诉我未指定密钥类型。 我没有尝试过各种有关生成证书的指南,因为我对.NET没有任何经验。我提到这一点是为了防止问题可能是由于生成证书的方式不正确引起的。 我也尝试过将

  • 问题内容: 有没有人最近在使用SQL Server数据库后端部署Django应用程序方面获得过经验?我们的工作场所在SQL Server上投入了大量资金,如果没有足够完善的后端,它将不支持Django。 我知道mssql.django-pyodbc和django- mssql是非正式支持的后端。这两个项目似乎都只有一个人供款,尽管供款似乎有些规律,但这有点令人担忧。 是否有其他受支持的SQL Se

  • Kibana 的配置很大程度上依赖于您的使用场景。如果只有自己使用,可以在自己的机器上运行 Kibana,配置它指向任何您想要交互的 Elasticsearch 实例。相反,如果有大量的 Kibana 使用者,需要多个 Kibana 实例连接至同一个 Elasticsearch 节点,来保证负载均衡。 尽管 Kibana 不是非常耗费资源,我们仍然建议运行 Kibana 的节点和 Elastics

  • 生产中的EAP EAP在默认的FreeRADIUS安装中开箱即用。但是,也有一些要点需要注意或更改以适应您的环境。在本节中,我们将介绍以下几点: 适当的公钥基础设施(PKI)的重要性 配置内部隧道虚拟服务器 内部和外部隧道识别的问题 禁用未使用的EAP方法 公共密钥基础设施简介公钥基础结构主要用于两件事: 验证某人的身份 通过不安全的连接交换安全数据 为了确保某人是他们声称的人,我们使用证书颁发机

  • 引言 Sentinel 目前已可用于生产环境,除了阿里巴巴以外,也有很多企业在生产环境中广泛使用 Sentinel。 生产环境的 Sentinel Dashboard 需要具备下面几个特性: 规则管理及推送,集中管理和推送规则。sentinel-core 提供 API 和扩展接口来接收信息。开发者需要根据自己的环境,选取一个可靠的推送规则方式;同时,规则最好在控制台中集中管理。 监控,支持可靠、快

  • 我的程序使用ZMQ进行通信。也就是说,服务器(C、linux)创建一个XPUB套接字,然后在一个线程中读取它,在另一个线程中发布数据(写入)。 客户端(java、jzmq、linux)创建一个SUB套接字,并订阅使用它。 一段时间后,服务器端在读取线程中接收SIGABRT。 什么可能是问题的根源?在不同的线程中读/写或创建XPUB/SUB对? 如果问题是在多线程中,那么使用XPUB套接字的正确范例