gpt4 book ai didi

python - Django将进度保存到下标的Session中

转载 作者:太空宇宙 更新时间:2023-11-03 17:20:40 25 4
gpt4 key购买 nike

所以我想知道这是如何正确完成的。我尝试将长时间运行的任务的进度保存在 request.session 对象中。并且能够使用另一种 View 方法获取进程的状态

我使用 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 中存储长时间运行的操作的状态是一个好的做法吗?

最佳答案

不同的进程不共享相同的内存空间,但它们每个进程都会获得一份副本。

在您的情况下,工作进程在 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()

这非常简单,如果没有设置状态,它实际上会阻止状态请求,但它给出了一个想法。

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

关于python - Django将进度保存到下标的Session中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33196312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com