2009-11-03 91 views
2

我需要在Web应用程序中执行耗时的任务。 由于任务可能非常繁重以至于他们只能在多个线程上运行,所以用户不必在几分钟内查看加载页面。Python中的多线程队列

所以我认为多线程队列将是一个很好的解决方案。 添加到队列中的每个对象实例都应该在其自己的线程上运行。

我有一个基本的想法,从哪里开始,但我敢打赌,有很多更好的解决方案已经写入或在你的大脑;)。

我的解决办法队列应该什么样子:

[ 
[ 
    obj_instance_1,[ 
        (function_1, function_args_1, priority_1), 
        (function_2, function_args_2, priority_2), 
       ] 
], 
[ 
    obj_instance_2,[ 
        (function_n, function_args_n, priority_n), 
       ] 
] 
] 

其中[]是列表和()的元组。

+0

您可能想看看django-lineup(http://code.google.com/p/django-lineup/) – ohnoes 2009-11-03 10:24:44

回答

2

您只需要您的元素来扩展threading.Thread并使用Conditions()来实现producer,consumer系统。

我会用自己的并发控制和一个add()方法维护一个线程池,允许其他代码将线程添加到池中。

Here is the documentation for Python threading它几乎遵循其他线程实现的约定......没有什么可怕的。

1

我不知道很多关于Python,但你所描述听起来像一个线程池是什么 - 这是一个快速谷歌

http://pypi.python.org/pypi/threadpool/

+0

+1此项目显示了很好地使用标准队列模块执行任务 – 2009-11-03 12:39:00

2

kamaelia提供工具来提取并发线程或过程等。

+1

为什么要重新创建Kamaelia已经为此提供了一个测试框架。 – 2009-11-03 10:49:30

6

Python标准库Queue模块已经是线程安全的并且已知并且应该满足您的要求。

这是一篇不错的论文Task Queue Implementation Pattern,它讨论了如何使用队列来处理任务队列。

+0

+1,很好的答案。我会在队列中看看自己。来自C背景,你往往只是重新实现:P – 2009-11-03 11:34:16

0

我建议你看看beanstalkdgearman

让您的Web服务器成为一台Web服务器,并通过将它们移动到一个外部工作人员队列中,从而独立且更安全地扩展长时间运行的作业。

0

我建议在多线程库中使用process pools。这是一个内置的库,并且抽象出您所需要的大部分实现,特别是因为池在列表上工作并且您的数据已经以列表的形式出现。您可以将其与池的map_async成员函数一起使用,并在完成特定任务时分配回调以通知用户。