Django将进度保存到Subscribp中的会话

2024-06-11 16:25:57 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我想知道这是怎么做的权利。 我试图将长时间运行的任务的进度保存在请求会话对象。而不是用另一个视图方法来获取进程的状态

我使用Pool类使我的长期运行进度异步:

MyCalculation.py
def longrunning(x,request):
  request.session['status'] = 5;
  return x*x

views.py
def dolongrunning(request, x):
  pool = Pool(processes=1)
  result = pool.apply_async(MyCalculation.longrunning, [x, request])
  return JsonResponse(..)

def status(request):
  return JsonResponse(request.session.get('status))

所以这不管用。我的异步作业没有执行,但请求对象没有获取我的进度信息。你知道吗

我怎样才能做到这一点,或者还有别的方法吗? 我觉得传递请求对象通常是个坏主意。 在Django/Python中存储长时间运行的操作的状态有什么好的做法?你知道吗


Tags: 对象方法py权利returnrequestsession状态
1条回答
网友
1楼 · 发布于 2024-06-11 16:25:57

不同的进程不共享相同的内存空间,但它们会为每个进程获取一个副本。你知道吗

在您的例子中,longrunning函数中工作进程接收的request对象是父进程中创建的对象的副本。对其中一个进程所做的更改不会影响其他进程。你知道吗

您要做的是将更新从工作进程发送到父进程,然后在父进程内更新请求状态。你知道吗

from multiprocessing import Pool, Queue


def worker(task, message_queue):  # longrunning
    # do something
    message_queue.put(5)
    # do something else
    message_queue.put(42)


def request_handler(request, task, message_queue):  # dolongrunning
    result = pool.apply_async(worker, [task, message_queue])
    return JsonResponse(..)


def status(request):
    status = message_queue.get()  # this is blocking if no messages in queue
    request.session['status'] = status;
    return JsonResponse(request.session['status'])


pool = Pool(processes=1) 
message_queue = Queue()

这是相当简单的,如果没有设置状态,它实际上会阻塞状态请求,但它给出了一个想法。你知道吗

更好的方法是将请求存储在缓冲区中,并使用线程保持消息队列为空。每次收到状态请求时,都会返回从工人处收到的上一次状态更新。你知道吗

相关问题 更多 >