Python Django+;multiprocessing.dummy.Pool+;睡眠=奇怪的结果

Python Django+;multiprocessing.dummy.Pool+;睡眠=奇怪的结果,python,django,multithreading,Python,Django,Multithreading,在我的Django应用程序中,当请求某个视图时,我想在后台做一些工作。为此,我创建了一个工人的multiprocessing.dummy.Pool,每当调用该URL时,我都会在其上启动一个新进程。要在后台执行的任务可能必须在两次重试之间有一定的超时时间 因为整个过程都是在UI线程上执行的,所以我想我应该使用sleep来超时。当我对这种安排进行单元测试时,一切正常,但当它在Django中运行时,线程会进入sleep语句,然后再也不会醒来,但当我重新启动Django应用程序时,线程会通过sleep语

在我的Django应用程序中,当请求某个视图时,我想在后台做一些工作。为此,我创建了一个工人的
multiprocessing.dummy.Pool
,每当调用该URL时,我都会在其上启动一个新进程。要在后台执行的任务可能必须在两次重试之间有一定的超时时间

因为整个过程都是在UI线程上执行的,所以我想我应该使用
sleep
来超时。当我对这种安排进行单元测试时,一切正常,但当它在Django中运行时,线程会进入sleep语句,然后再也不会醒来,但当我重新启动Django应用程序时,线程会通过sleep语句,然后会立即被重新启动杀死。我知道我可以使用
Timer
s来安排重试,但我想要一个更简单的解决方案

以下是我的代码的简化版本:

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")
来自multiprocessing.dummy导入池的

池=池(设置。池\u工作者)
def后台_任务(arg):
刷新=真
尝试:
对于范围内的i(设置。获取\u重试\u限制):
状态,结果=(参数,刷新=刷新)
刷新=错误
如果状态为Statuses.OK:
返回结果
如果i

UPD:顺便说一句,工人们很可能是被哈拉基里杀死的。不要这样做。使用一个合适的离线处理器,即芹菜。这是我最初的想法,但我们的管理层说,实施它可能太长。同时,我会仔细阅读芹菜。