Python 2.7(Web2Py)多线程队列/任务管理

Python 2.7(Web2Py)多线程队列/任务管理

问题描述:

我是Python新手,我只是想知道是否可以用Web2Py轻松实现以下功能。Python 2.7(Web2Py)多线程队列/任务管理

背景:

我有一个web表单,用户可以上传一个zip文件和web应用程序将内部处理文件并显示结果。现在一切正常,但我做webapp的方式是单线程,即web应用程序将解压zip文件并逐个处理文件,并在所有文件处理完毕后显示结果。

我使用第三方脚本处理文件,当作业完成时不会提示任何内容。它只会在磁盘上创建一个结果文件。

由于每个文件需要至少2-5分钟的时间来处理,而且我有一个12个vCPU的云服务器,所以我现在的做法效率极低。

目标:

我想有它在多线程运行,即放入队列中的所有文件,并处理它们在批量并行。

问题:

说,如果用户上传的小于12个文件工人的最大数量被设置为12,那么它应该为每个文件创建一个工人和并行处理它们。

我已经使用线程完成了这部分。如果用户想要在页面上等待结果(或者用户可以随时返回以查看其帐户中的结果),则结果页面将每5分钟刷新一次。 Web应用程序只需检查磁盘以查看结果文件是否存在,如果只是显示它。

如何能够做到:

如果用户上传的超过12个文件(比如30个文件为例)。应该创建12个工作人员,并处理前12个文件。每当工作完成处理文件时,就会创建一个新的工作人员从队列中取出一个文件并进行处理。有没有办法,只要工作人员完成脚本的运行,就会创建一个新的工作人员来运行?

因为我是Python的新手(实际上是编程的新手),实现这一点的一个简单方法将非常感谢。谢谢。

由于您正在处理第三方脚本中的文件,因此这与web2py无关。

考虑files_count是应用程序需要处理的文件数量。然后你可以使用以下条件:

threads_count = files_count if files_count < 12 else 12 

现在threads_count认为你能够推出的线程数,最大的12接下来,创建一个队列(这是线程安全的),这将是由每个线程/工作人员使用,并使用文件名填充它。

from threading import Thread 
from Queue import Queue, Empty 

q = Queue() 
for filename in filenames: 
    q.put(filename) 

for i in xrange(threads_count): 
    t = Thread(target=worker, args=(q,)) 
    t.start() 

最后,既然你已经有了你的worker功能,进行必要的更改接收q参数。

def worker(q, ...): 
    try: 
     filename = q.get(block=False) 
    except Empty: 
     # All files have been processed. 
     return 

您不知道每个工作人员将处理多少个文件。只要有一名工作人员可用,它将立即从队列中消耗一项新任务,或者在队列为空时退出。

希望它有帮助!

+0

谢谢你的帮助。我在考虑是否可以创建12名员工(假设上传30个文件),当每个工作人员完成任务时,如果队列中还有任何工作,它会创建一名新工人。这会工作吗?如果我按自己的方式执行工作函数,是否需要将'try ... except'放入循环中?像'一样:'? –

+0

@AlwynPan这是可能的,但为什么你会创建一个新的线程,并删除旧的线程,如果你可以使用它来处理下一个任务时,前一个完成? – cdonts