使用python/mod_wsgi的多生产者、单一消费者
我有一个由Apache提供服务的Pylons web应用程序(mod_wsgi,prefork)。由于Apache,有多个单独的进程同时运行我的应用程序代码。我希望将应用程序执行的一些非关键任务推迟到后台处理,以提高“实时”响应时间。所以我想到了任务队列,许多Apache进程向这个队列添加任务,一个单独的Python进程逐个处理任务并从队列中删除 最好将队列持久化到磁盘,以便队列中未处理的任务不会因为断电、服务器重启等而丢失。问题是,实现此类队列的合理方法是什么使用python/mod_wsgi的多生产者、单一消费者,python,apache,concurrency,synchronization,producer,Python,Apache,Concurrency,Synchronization,Producer,我有一个由Apache提供服务的Pylons web应用程序(mod_wsgi,prefork)。由于Apache,有多个单独的进程同时运行我的应用程序代码。我希望将应用程序执行的一些非关键任务推迟到后台处理,以提高“实时”响应时间。所以我想到了任务队列,许多Apache进程向这个队列添加任务,一个单独的Python进程逐个处理任务并从队列中删除 最好将队列持久化到磁盘,以便队列中未处理的任务不会因为断电、服务器重启等而丢失。问题是,实现此类队列的合理方法是什么 至于我尝试过的东西:我从简单的S
至于我尝试过的东西:我从简单的SQLite数据库开始,其中有一个表用于存储队列项目。在负载测试中,当提高并发级别时,我开始像预期的那样出现“数据库锁定”错误。quick'n'dirty修复程序是用MySQL替换SQLite——它可以很好地处理并发性问题,但对于我需要做的简单的事情来说,感觉像是一种过火。队列相关的数据库操作也在我的评测报告中显著地显示出来。像Apache这样的消息代理是一个理想的解决方案 管道可以是:
- 负责处理HTTP请求的应用程序进程快速生成响应,并将低优先级、繁重的任务发送到AMQ队列
- 订阅一个或多个其他进程以使用AMQ队列,并对这些繁重的任务执行预期的操作
在我们用Python编写的项目中,我们使用类似的东西作为底层通信协议。像Apache这样的消息代理是一个理想的解决方案 管道可以是:
- 负责处理HTTP请求的应用程序进程快速生成响应,并将低优先级、繁重的任务发送到AMQ队列
- 订阅一个或多个其他进程以使用AMQ队列,并对这些繁重的任务执行预期的操作
如果您遇到严重的可伸缩性问题,只需将后端服务器包装在lighttpd或其他web引擎中,即可创建多线程后端。“但感觉有点过头了”?“简单的事情”你怎么叫它“简单”?这对您来说是一个严重的可伸缩性问题;你为什么称之为“简单”?在实现方面最简单。我现在正在使用SQLAlchemy进行DB访问,使用SQLAlchemy从SQLite切换到MySQL很容易:只需在Pylons应用程序的配置文件中更改“SQLAlchemy.url”参数,“但感觉像是一种过度使用”?“简单的事情”你怎么叫它“简单”?这对您来说是一个严重的可伸缩性问题;你为什么称之为“简单”?在实现方面最简单。我现在正在使用SQLAlchemy进行DB访问,使用SQLAlchemy从SQLite切换到MySQL很容易:只需更改Pylons应用程序配置文件中的“SQLAlchemy.url”参数。有趣的是,似乎现成的消息队列服务器确实是我在这里需要的。环顾四周后,RabbitMQ似乎相当轻量级,易于在通用平台上部署。是的。如果你在努力提高光速,我建议你也看看ZeroMQ。与其他MQs相比,它在较低级别上工作,但潜在性能要高得多。有趣的是,似乎现成的消息队列服务器确实是我在这里需要的。环顾四周后,RabbitMQ似乎相当轻量级,易于在通用平台上部署。是的。如果你在努力提高光速,我建议你也看看ZeroMQ。与其他MQs相比,它在较低级别上工作,但潜在性能要高得多。