Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python/mod_wsgi的多生产者、单一消费者_Python_Apache_Concurrency_Synchronization_Producer - Fatal编程技术网

使用python/mod_wsgi的多生产者、单一消费者

使用python/mod_wsgi的多生产者、单一消费者,python,apache,concurrency,synchronization,producer,Python,Apache,Concurrency,Synchronization,Producer,我有一个由Apache提供服务的Pylons web应用程序(mod_wsgi,prefork)。由于Apache,有多个单独的进程同时运行我的应用程序代码。我希望将应用程序执行的一些非关键任务推迟到后台处理,以提高“实时”响应时间。所以我想到了任务队列,许多Apache进程向这个队列添加任务,一个单独的Python进程逐个处理任务并从队列中删除 最好将队列持久化到磁盘,以便队列中未处理的任务不会因为断电、服务器重启等而丢失。问题是,实现此类队列的合理方法是什么 至于我尝试过的东西:我从简单的S

我有一个由Apache提供服务的Pylons web应用程序(mod_wsgi,prefork)。由于Apache,有多个单独的进程同时运行我的应用程序代码。我希望将应用程序执行的一些非关键任务推迟到后台处理,以提高“实时”响应时间。所以我想到了任务队列,许多Apache进程向这个队列添加任务,一个单独的Python进程逐个处理任务并从队列中删除

最好将队列持久化到磁盘,以便队列中未处理的任务不会因为断电、服务器重启等而丢失。问题是,实现此类队列的合理方法是什么


至于我尝试过的东西:我从简单的SQLite数据库开始,其中有一个表用于存储队列项目。在负载测试中,当提高并发级别时,我开始像预期的那样出现“数据库锁定”错误。quick'n'dirty修复程序是用MySQL替换SQLite——它可以很好地处理并发性问题,但对于我需要做的简单的事情来说,感觉像是一种过火。队列相关的数据库操作也在我的评测报告中显著地显示出来。

像Apache这样的消息代理是一个理想的解决方案

管道可以是:

  • 负责处理HTTP请求的应用程序进程快速生成响应,并将低优先级、繁重的任务发送到AMQ队列
  • 订阅一个或多个其他进程以使用AMQ队列,并对这些繁重的任务执行预期的操作
队列持久性的要求是现成的,因为ActiveMQ存储尚未在持久性存储中使用的消息。此外,它的扩展性相当好,因为您可以在不同的机器上自由部署多个HTTP应用程序、多个消费者应用程序和AMQ本身


在我们用Python编写的项目中,我们使用类似的东西作为底层通信协议。

像Apache这样的消息代理是一个理想的解决方案

管道可以是:

  • 负责处理HTTP请求的应用程序进程快速生成响应,并将低优先级、繁重的任务发送到AMQ队列
  • 订阅一个或多个其他进程以使用AMQ队列,并对这些繁重的任务执行预期的操作
队列持久性的要求是现成的,因为ActiveMQ存储尚未在持久性存储中使用的消息。此外,它的扩展性相当好,因为您可以在不同的机器上自由部署多个HTTP应用程序、多个消费者应用程序和AMQ本身

在我们用Python编写的项目中,我们使用类似的方法作为底层通信协议。

web服务器(任何web服务器)都是多生产者、单消费者进程

一个简单的解决方案是构建一个或后端服务器来处理您的后端请求

因为这个“后端”服务器是使用WSGI技术构建的,所以它非常非常类似于前端web服务器。除了它不会生成HTML响应(JSON通常更简单)。除此之外,它非常简单

您可以为此后端设计RESTful事务。您可以使用各种WSGI特性进行URI解析、授权、身份验证等。通常,您不需要会话管理,因为RESTful服务器通常不提供会话

如果遇到严重的可伸缩性问题,只需将后端服务器包装在lighttpd或其他web引擎中,即可创建多线程后端。

web服务器(任何web服务器)都是多生产者、单消费者进程

一个简单的解决方案是构建一个或后端服务器来处理您的后端请求

因为这个“后端”服务器是使用WSGI技术构建的,所以它非常非常类似于前端web服务器。除了它不会生成HTML响应(JSON通常更简单)。除此之外,它非常简单

您可以为此后端设计RESTful事务。您可以使用各种WSGI特性进行URI解析、授权、身份验证等。通常,您不需要会话管理,因为RESTful服务器通常不提供会话


如果您遇到严重的可伸缩性问题,只需将后端服务器包装在lighttpd或其他web引擎中,即可创建多线程后端。

“但感觉有点过头了”?“简单的事情”你怎么叫它“简单”?这对您来说是一个严重的可伸缩性问题;你为什么称之为“简单”?在实现方面最简单。我现在正在使用SQLAlchemy进行DB访问,使用SQLAlchemy从SQLite切换到MySQL很容易:只需在Pylons应用程序的配置文件中更改“SQLAlchemy.url”参数,“但感觉像是一种过度使用”?“简单的事情”你怎么叫它“简单”?这对您来说是一个严重的可伸缩性问题;你为什么称之为“简单”?在实现方面最简单。我现在正在使用SQLAlchemy进行DB访问,使用SQLAlchemy从SQLite切换到MySQL很容易:只需更改Pylons应用程序配置文件中的“SQLAlchemy.url”参数。有趣的是,似乎现成的消息队列服务器确实是我在这里需要的。环顾四周后,RabbitMQ似乎相当轻量级,易于在通用平台上部署。是的。如果你在努力提高光速,我建议你也看看ZeroMQ。与其他MQs相比,它在较低级别上工作,但潜在性能要高得多。有趣的是,似乎现成的消息队列服务器确实是我在这里需要的。环顾四周后,RabbitMQ似乎相当轻量级,易于在通用平台上部署。是的。如果你在努力提高光速,我建议你也看看ZeroMQ。与其他MQs相比,它在较低级别上工作,但潜在性能要高得多。