后台线程在服务器关闭之前未启动

时间:2016-02-01 21:39:30

标签: python multithreading flask uwsgi

我在使用简单的多线程功能并在我的网络应用程序中运行时遇到了一些麻烦。

我在Ubuntu 12.04上使用Flask,uwsgi,nginx。

每次启动新线程时,在关闭uwsgi服务器之前都不会执行。很奇怪!

如果我正在执行一项简单的任务(例如打印),它将按预期执行9/10次。如果我执行繁重的计算工作(例如文件上的OCR),当服务器重新启动(执行关闭)时,它将始终开始执行

知道为什么我的代码没有按预期执行?

代码:

def hello_world(world):
    print "Hello, " + world # This will get printed when the uwsgi server restarts

def thread_test():
    x = "World!"
    t = threading.Thread(target=hello_world, args=(x,))
    t.start()

@application.route('/api/test')
def test():
    thread_test()
    return "Hello, World!", 200

编辑1:

我的uwsgi配置如下所示:

[uwsgi]
chdir       = /Users/vingtoft/Documents/Development/archii/server/archii2/
pythonpath  = /Users/vingtoft/Documents/Development/archii/server/archii2/
pythonpath  = /Users/vingtoft/Documents/Development/archii/server/ml/
module      = app.app:application
master      = True
vacuum      = True
socket      = /tmp/archii.sock 
processes   = 4
pidfile     = /Users/vingtoft/Documents/Development/archii/server/archii2/uwsgi.pid 
daemonize   = /Users/vingtoft/Documents/Development/archii/server/archii2/uwsgi.log
virtualenv  = /Users/vingtoft/Documents/Development/virtualenv/flask/
wsgi-file   = /Users/vingtoft/Documents/Development/archii/server/archii2/app/app.py
ssl         = True

1 个答案:

答案 0 :(得分:2)

默认情况下,uWSGI服务器将禁用线程支持以获得某些性能改进,但您可以使用以下任一方法启用它:

threads = 2 # or any greater number

enable-threads = true

要警告第一种方法会告诉uWSGI为每个工作人员创建2个线程,这样对于4名工作人员,最终会得到8个实际线程。 / p>

线程将作为单独的worker工作,因此它们不适合用于后台作业,但使用大于1的任意数量的线程将为uWSGI服务器启用线程支持,因此现在您可以为某些后台创建更多线程任务。