Django + multiprocessing.dummy.Pool + sleep =奇怪的结果

时间:2017-07-10 11:04:10

标签: python django multithreading

在我的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杀死

0 个答案:

没有答案