当前位置: 首页 > 知识库问答 >
问题:

运行异步调用时UWSGI和GUnicorn之间的差异

爱花蜂
2023-03-14

我有一个Django应用程序,在我的一个视图中,我实际上正在对一个发送电子邮件的函数进行异步调用。我都使用了threading.thread(与start())以及一个名为after_response的小django包,它基本上做同样的事情。

以下是我所做的:

def my_synchronous_function(instance):
    send_email_asynchronous.after_response(instance.id)
    return "We are done here, but async call will continue."

@after_response.enable
def send_email_asynchronous(instance_id):
    time.sleep(5)
    print "Async has started"
    instance = Instance.objects.get(pk=instance_id)
    subject = "A subject"
    ctx = {'username': instance.username}
    message = get_template("email-template.html").render(ctx)
    msg = EmailMessage(subject, message, to=[instance.email], from_email='loic@example.com')
    print "about to send email"
    time.sleep(5)
    msg.content_subtype = 'html'
    msg.send()
    print "message sent"

这段代码在运行djangomanage.pyrunserver时效果很好;在使用nginx Gunicorn时也很好。但是,我注意到当使用UWSGI和Nginx时,send_email_asynchronous函数从未被调用。当使用after_response以及更长的线程时,情况确实如此。线程版本:

class SendNotification(threading.Thread):
    """
    Sends notifications async.
    """
    def __init__(self, instance_id):
        """
        Sends notifications asynchronously provided an instance id.
        """
        print "instance id: %s" % instance_id
        self.instance = Instance.objects.get(pk=instance_id)
        super(SendNotification, self).__init__()

    def run (self):
        time.sleep(5)
        print "Async has started"
        subject = "A subject"
        ctx = {'username': self.instance.username}
        message = get_template("email-template.html").render(ctx)
        msg = EmailMessage(subject, message, to=[self.instance.email],                              from_email='loic@example.com')
        print "about to send email"
        time.sleep(5)
        msg.content_subtype = 'html'
        msg.send()
        print "message sent"

这是通过以下方式启动的:SendNotification(instance.id).start()

同样,在开发服务器“runserver”上运行良好,在Gunicorn上也运行良好,但在uwsgi上不运行,我有点困惑为什么会发生这种情况。对于uwsgi,我实际上看到了来自init的print语句,但没有看到来自run方法的print语句,当然,也没有电子邮件。因为这个问题,我已经转向使用Gunicorn,所以我问这个问题更多的是出于好奇。

谢谢

共有1个答案

穆洋
2023-03-14

您没有发布您的uWSGI配置,但考虑到这是关于后台线程未运行的问题,在启动uWSGI时,您很可能需要添加--启用线程

如果在没有线程的情况下启动uWSGI,则不会启用Python GIL,因此应用程序生成的线程将永远不会运行。您可能不喜欢这种选择,但请记住,uWSGI是一个独立于语言的服务器,所以它的大多数选择都是为了维护它的“不可知性”。

但是别担心,uWSGI开发者基本上没有什么选择是不能用选项改变的。

如果您想在不启动应用程序的多个线程的情况下保持对Python线程的支持,只需添加--enable-thread选项(或ini风格的enable-thread=true)。

 类似资料:
  • 本文向大家介绍同步和异步时序电路之间的差异,包括了同步和异步时序电路之间的差异的使用技巧和注意事项,需要的朋友参考一下 顾名思义,同步时序电路和异步时序电路都是将反馈用于下一代输出的时序电路的类型,但是根据这种反馈的类型,可以区分两个电路。 以下是同步和异步时序电路之间的重要区别 - 序号 键 同步时序电路 异步时序电路 定义 另一方面,异步时序电路是数字时序电路,其中到下一个生成的输入的反馈不受

  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。

  • 我编写了一个简单的脚本,它接受任意数量的参数来演示< code>$@和< code>$*之间的区别: 在我做的 CLI 上 这就是打印出来的 因为它们是相同的,这是否意味着等于?还是我遗漏了一点?

  • 本文向大家介绍成本差异和进度差异之间的差异,包括了成本差异和进度差异之间的差异的使用技巧和注意事项,需要的朋友参考一下 对于任何应用程序或专门用于任何项目,最关注的因素之一是在开发前和开发后阶段的预算管理和时间管理。因此,要评估任何项目的这两个主要因素,有很多方法,其中成本差异和进度差异是两个重要且主要的方法。 顾名思义,“成本差异”基于项目开发中花费的成本,而“进度差异”则基于相同开发中花费的时

  • 和操作符之间有什么区别,它们的用例是什么?他们似乎都在等待一项任务?

  • 在任何情况下(反之亦然),是否有任何理由选择并行的。对于每个而不是等待ForEachAsync?或者它们实际上是相同的? VS公司