从Django vi访问进程数据

2024-06-20 04:18:59 发布

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

我对python和Django非常陌生,我正在努力理解解决问题的最佳方法是:

我有一个视图,它必须激活进程/任务/线程并返回成功。 进程/任务/线程操作一个设备,它将根据设备输入更新其状态。 然后我有另一个视图,我将用ajax进行轮询,这个视图应该能够查询后台进程/任务/线程,以了解其状态并将其返回给调用者。在

我读过很多不同的选项,比如多处理,gevent,celery,session,但是我还是不能理解它。在

尝试了会话,但显然我无法从后台任务中访问请求对象。 我没有尝试gevent或celery只是因为我认为如果不使用任何额外的框架,会有一个更简单的解决方案(不想安装RabbitMQ等…)。 尝试了多重处理,代码如下:

def test_process(request):
    manager = Manager()
    d = manager.dict()
    p = Process(target=test_function, args=(d, ))
    p.daemon = True
    p.start()
    return HttpResponse(json.dumps('Ok'), content_type="application/json")


def test_function(d):
    d['test'] = 'alex'


def test_manager(request):
    manager = Manager()
    data = manager.dict().get('test')
    return HttpResponse(json.dumps(data), content_type="application/json")

在我写了这篇文章之后,我意识到这个字典可能只被后台进程和执行test峎process的请求的进程共享,因此test_manager得到了一个空字典。在

不知道从这里到哪里去

有什么帮助吗?在

干杯


Tags: test视图json进程request状态defmanager
1条回答
网友
1楼 · 发布于 2024-06-20 04:18:59

要使用多处理接口在子进程和父进程之间共享数据,可以使用https://docs.python.org/2/library/multiprocessing.html中建议的方法之一,例如队列或管道。在

下面是使用队列从Django web应用程序中与子进程对话时应该做的事情(我假设后台/子进程正在为web应用程序的所有用户控制一个设备,这样每个人都会得到相同的结果,这也可能是每个会话的结果):

  • 在您的视图.py像这样global_q = Queue()。在
  • 创建用于初始化进程的视图,并将全局Queue传递给process函数:
def init_process(request):
    p = Process(target=the_process, args=(global_q, ))
    p.daemon = True
    p.start()
    return HttpResponse(json.dumps('Ok'), content_type="application/json")
  • 创建将从全局队列读取的其他视图:
^{pr2}$
  • 您的process函数在需要时处理设备并在队列参数中写入事件:
def the_process(local_q):
    # do some things
    local_q.put([6])
    # do some other things
    local_q.put([34])

为了使上面的工作没有问题,你必须检查队列是空的还是非阻塞的等等,但是你会明白的。在

相关问题 更多 >