Gunicorn工人关键时间(使用烧瓶)

时间:2017-12-04 09:47:59

标签: python multithreading flask gunicorn gevent

我正在获得Gunicorn关键工作者超时,我可以通过增加超时来解决这个问题,然而,这似乎不是正确的方法,因为线程完成某些任务可能需要一个多小时。

我的服务器: 一开始,它使用Google Word2Vec模型计算特定的NLP任务。完成此操作后,它将开始响应HTTP get / put请求以执行相关处理。服务器一启动就启动多个线程,并阻止加入线程以完成这些任务。很难在这里输入确切的代码。但是,它确实是这样的:

def worker():
    while True:
        item = q.get()
        if item is None:
            break
        do_work(item)
        q.task_done()

q = queue.Queue()
threads = []
for i in range(num_worker_threads):
    t = threading.Thread(target=worker)
    t.start()
    threads.append(t)

for item in source():
    q.put(item)

# block until all tasks are done
q.join()

# stop workers
for i in range(num_worker_threads):
    q.put(None)
for t in threads:
    t.join()

Dowork是NLP任务,大约需要1-2秒。现在如果有10个任务,那么我可以将超时设置为20秒并且它工作正常(假设我正在运行一个线程)。但是,如果我折叠任务,那么我会收到严重超时错误。我有成千上万的这些任务需要在服务器启动服务请求之前完成。

我运行的命令的一部分:

gunicorn -t 240 -k gevent .......

一种方法是增加超时到3小时应该没问题,但我不认为是否建议。我的替代方案是什么?如何让线程向相关的仲裁者宣布工人还活着,这样他们就不会被杀死?

0 个答案:

没有答案