Python Django+;multiprocessing.dummy.Pool+;睡眠=奇怪的结果
在我的Django应用程序中,当请求某个视图时,我想在后台做一些工作。为此,我创建了一个工人的Python Django+;multiprocessing.dummy.Pool+;睡眠=奇怪的结果,python,django,multithreading,Python,Django,Multithreading,在我的Django应用程序中,当请求某个视图时,我想在后台做一些工作。为此,我创建了一个工人的multiprocessing.dummy.Pool,每当调用该URL时,我都会在其上启动一个新进程。要在后台执行的任务可能必须在两次重试之间有一定的超时时间 因为整个过程都是在UI线程上执行的,所以我想我应该使用sleep来超时。当我对这种安排进行单元测试时,一切正常,但当它在Django中运行时,线程会进入sleep语句,然后再也不会醒来,但当我重新启动Django应用程序时,线程会通过sleep语
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:顺便说一句,工人们很可能是被哈拉基里杀死的。不要这样做。使用一个合适的离线处理器,即芹菜。这是我最初的想法,但我们的管理层说,实施它可能太长。同时,我会仔细阅读芹菜。