在我的Django应用程序中,我想在请求某个视图时在后台做一些工作。为此,我创建了一个multiprocessing.dummy.Pool
个worker,每当调用该URL时,我就会在其上启动一个新进程。要在后台执行的任务可能需要进行一些重试,并且它们之间会有一定的超时。
由于整个事情都已执行,可以这么说,而不是在UI线程上,我以为我会使用sleep
来超时。当我对这种安排进行单元测试时,一切正常,但是当它在Django中运行时,线程进入sleep语句然后从不醒来,但是当我重新启动Django应用程序时,线程会超过sleep语句然后立即被杀死通过重启。我知道我可以使用Timer
来安排重试,但我想要一个更简单的解决方案。
这是我的代码的简化版本:
from multiprocessing.dummy import Pool
POOL = Pool(settings.POOL_WORKERS)
def background_task(arg):
refresh = True
try:
for i in range(settings.GET_RETRY_LIMIT):
status, result = (arg, refresh=refresh)
refresh = False
if status is Statuses.OK:
return result
if i < settings.GET_RETRY_LIMIT - 1:
sleep(settings.GET_SLEEP_TIME)
except Exception as e:
logging.error(e)
return []
def do_background_work(arg):
POOL.apply_async(
background_task,
(arg)
)
def my_view(request):
arg = get_arg_from_request(request)
do_background_work(arg)
return Response("Ok")
UPD:顺便说一下,工作人员最有可能被Harakiri
杀死