我需要在Web应用程序中执行耗时的任务。 因为任务可能非常繁重,以至于它们运行几分钟,所以它们必须在多个线程上运行,因此用户不必在几分钟内查看加载页面。
所以我认为多线程队列是一个很好的解决方案。 您添加到队列的对象的每个实例都应该在其自己的线程上运行。
我有一个基本的想法从哪里开始,但我敢打赌,已经有更好的解决方案已经写好或者你的大脑;)。
我的解决方案队列应该如何:
[
[
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 :(得分:6)
Python标准库Queue模块已经是线程安全且可识别的,应该可以满足您的要求。
这是一篇很好的论文Task Queue Implementation Pattern,讨论了如何将队列用于任务队列。
答案 1 :(得分:2)
你只需要你的元素来扩展threading.Thread并使用Conditions()来实现producer,consumer系统。
我会使用它自己的并发控制和add()方法维护一个线程池,允许其他一些代码将线程添加到池中。
Here is the documentation for Python threading几乎遵循其他线程实现的约定......没什么可怕的。
答案 2 :(得分:2)
kamaelia提供了将并发抽象到线程或进程等的工具。
答案 3 :(得分:1)
我对python知之甚少,但你所描述的内容听起来像一个线程池 - 这是来自一个快速的谷歌
答案 4 :(得分:0)
我建议您查看beanstalkd或gearman。
让您的Web服务器成为Web服务器,并通过将它们通过队列移动到外部工作程序来独立且更安全地扩展长时间运行的作业。
答案 5 :(得分:0)
我建议使用多线程库中的process pools。这是一个内置的库,并且提取了您需要的大部分实现,特别是因为池在列表上工作而您的数据已经是列表的形式。您可以将它与池的map_async成员函数一起使用,并指定回调以在完成特定任务时通知用户。