Python Django-在apache为每个请求创建的所有进程之间共享RabbitMQ连接?

Python Django-在apache为每个请求创建的所有进程之间共享RabbitMQ连接?,python,django,apache,rabbitmq,pika,Python,Django,Apache,Rabbitmq,Pika,我的堆栈是Django 1.3(Python 2.7)+Apache+mod_wsgi Apache为每个请求生成一个新进程。。。有时,在这些请求中,我必须向RabbitMQ发布一条消息,告知稍后要完成的一些繁重任务(例如通知某人的追随者他们刚刚发布的猫照片) 发布需要连接到RabbitMQ,这很昂贵。(见此问题:) 我还遗憾地意识到Python无法跨进程共享内存。。。叹息:( 在这种情况下,如何防止每个apache请求创建和关闭RabbitMQ连接的开销 为清楚起见,以下是我使用RabbitM

我的堆栈是Django 1.3(Python 2.7)+Apache+mod_wsgi

Apache为每个请求生成一个新进程。。。有时,在这些请求中,我必须向RabbitMQ发布一条消息,告知稍后要完成的一些繁重任务(例如通知某人的追随者他们刚刚发布的猫照片)

发布需要连接到RabbitMQ,这很昂贵。(见此问题:)

我还遗憾地意识到Python无法跨进程共享内存。。。叹息:(

在这种情况下,如何防止每个apache请求创建和关闭RabbitMQ连接的开销

为清楚起见,以下是我使用RabbitMQ+pika在进程之间共享连接的失败尝试:

def test_view(request):
    """a django view publishing to RabbitMQ"""
    connection = Connection.get_shared_connection()
    channel = connection.channel() 
    channel.queue_declare(queue='test_queue', auto_delete=False, durable=True)
    channel.basic_publish(exchange='', routing_key='test_queue', body='Hello Rabbit!', 
                                properties=pika.BasicProperties(delivery_mode=2))
    print 'SENT:', body

    return HttpResponse("published")


class Connection(object):
    """failed attempt to create a singleton"""
    _connection = None

    @staticmethod
    def get_shared_connection(): # return a pika connection
        if not Connection._connection:
            print 'NEW CONNECTION'  # prints NEW CONNECTION with every request
            Connection._connection = pika.BlockingConnection(pika.ConnectionParameters(
                                                                           host='localhost'))
        return Connection._connection
在服务器设置中(Django+Apache+mod\u wsgi)
“新连接”
与对
test\u视图的每个请求一起打印

这似乎是任何人在使用Django和RabbitMQ时都会遇到的问题。必须有一种方法


谢谢…非常感谢您的帮助

Apache不会为每个请求生成新的进程

您可能会误以为这是因为在嵌入式模式下,它可以是一个多进程web服务器,因此不同的请求可以在单独的进程中处理

我会建议您使用mod_wsgi守护进程模式并使用单个多线程进程,但不幸的是,您的代码不是线程安全的,因为您不能同时从多个线程保护全局套接字连接的创建。但是,如果多个线程尝试使用一个连接,那么仅此一种方式是没有帮助的n同时,它可能会导致问题。因此,每个线程都需要一个连接对象

我建议您阅读以下内容,了解Apache/mod_wsgi的不同进程/线程模型的背景知识


嗨,你是如何解决这个问题的?我和你面临着同样的问题。