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
您不知道每个工作人员将处理多少个文件。只要有一名工作人员可用,它将立即从队列中消耗一项新任务,或者在队列为空时退出。
希望它有帮助!
谢谢你的帮助。我在考虑是否可以创建12名员工(假设上传30个文件),当每个工作人员完成任务时,如果队列中还有任何工作,它会创建一名新工人。这会工作吗?如果我按自己的方式执行工作函数,是否需要将'try ... except'放入循环中?像'一样:'? –
@AlwynPan这是可能的,但为什么你会创建一个新的线程,并删除旧的线程,如果你可以使用它来处理下一个任务时,前一个完成? – cdonts