【问题标题】:Python 2.7 (Web2Py) Multithreading Queue / Task ManagementPython 2.7 (Web2Py) 多线程队列/任务管理
【发布时间】:2017-05-16 05:20:38
【问题描述】:

我是 Python 新手,我只是想知道以下是否可以通过 Web2Py 轻松实现。

背景:

我有一个 web 表单,用户可以上传一个 zip 文件,webapp 将处理里面的文件并显示结果。现在一切正常,但是我做 webapp 的方式是单线程的,即 webapp 将解压缩 zip 文件并一个一个处理里面的文件,并在处理所有文件时显示结果。

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

由于每个文件至少需要 2 - 5 分钟来处理,而且我有一个具有 12 个 vCPU 的云服务器,所以我现在这样做的方式非常低效。

目标:

我想让它在多线程中运行,即将所有文件放在一个队列中并并行处理它们。

问题:

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

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

我该如何实现:

如果用户上传了超过 12 个文件(例如 30 个文件)。应创建 12 个工作人员,并处理前 12 个文件。每当工作完成处理文件时,将创建一个新的工作人员以从队列中获取文件并进行处理。有没有一种方法,一旦 worker 完成运行脚本,它就会创建一个新的 worker 来运行?

由于我是 Python 新手(实际上是编程新手),因此非常感谢一种实现这一目标的简单方法。谢谢你。

【问题讨论】:

    标签: python multithreading python-2.7 queue web2py


    【解决方案1】:

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

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

    threads_count = files_count if files_count < 12 else 12
    

    现在threads_count 保存您能够启动的线程数,最多 12 个。接下来,创建一个队列(这是线程安全的),每个线程/worker 将使用该队列并填充它带有文件名。

    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
    

    您事先不知道每个工作人员将处理多少个文件。一旦有一个 worker 可用,它会立即从队列中消费一个新任务,如果队列为空则退出。

    希望对你有帮助!

    【讨论】:

    • 感谢您的帮助。我在想我是否可以只创建 12 个工作人员(假设上传了 30 个文件),当每个工作人员完成任务时,如果队列中还有任何工作,它会创建一个新工作人员。这行得通吗?如果我按照你的方式做,对于工作函数,我是否需要将try ... except 放入循环中?喜欢while ture:
    • @AlwynPan 这是可能的,但是如果你可以在前一个任务完成后使用它来处理下一个任务,你为什么要创建一个新线程并删除旧线程?
    猜你喜欢
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2010-10-29
    • 2013-10-10
    相关资源
    最近更新 更多