我正在获得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小时应该没问题,但我不认为是否建议。我的替代方案是什么?如何让线程向相关的仲裁者宣布工人还活着,这样他们就不会被杀死?