0

在 Flask 中的路由请求中,我如何触发一个线程启动并让它立即继续到下一行。在下面的代码中,如何在新线程生成后立即打印“已经到下一个”,而不是等待约 10 秒才能完成?

谢谢!

def consumer(searchValue,assignedUniqueID):
    print "Searching..."
    print "Running thread! Args:", (searchValue, assignedUniqueID)
    time.sleep(10)
    print "Done!"

@app.route('/_search')
def add_numbers():
    assignedUniqueID = str(uuid.uuid4())
    Thread(target=consumer(searchValue,assignedUniqueID)).start()
    print "Onto the next already"
    return jsonify(result="33434443",
                       assignedUniqueID = assignedUniqueID
               )
4

1 回答 1

1

对不起,这更像是一个评论而不是一个答案,我在这里发帖是因为评论系统有点大。

鉴于 Flask 广泛使用线程本地存储其他魔法,这种错误很难在 Flask 中跟踪。

在 Web 应用程序中,多任务处理通常通过使用队列而不是线程来处理,Web 应用程序排队任务和后台守护进程(工作人员)完成这项工作。这种方法可以更好地扩展:

  • 工人可以住在其他机器上
  • 并行运行的worker数量比运行线程的数量更容易控制。我已经看到即使是很小的流量激增也会在使用线程时导致服务器停止。
  • 更容易同步和/或处理并发

特别流行的是涉及AMQP或键/值数据库(如redismemcached )的解决方案。对于 Python 中的 AMQP,看看celery,我经常将它与 Django 结合使用。

于 2013-05-20T02:07:13.193 回答