Python 从django视图访问流程数据

Python 从django视图访问流程数据,python,django,multithreading,session,multiprocessing,Python,Django,Multithreading,Session,Multiprocessing,我对python和Django非常陌生,我正在努力理解解决我的问题的最佳方法是什么,即: 我有一个视图,它必须激活一个进程/任务/线程并返回一个成功。 进程/任务/线程操作设备,并根据设备输入更新其状态。 然后,我将使用ajax轮询另一个视图,该视图应该能够查询后台进程/任务/线程,以了解其状态并将其返回给调用者 我读过很多不同的选项,比如多重处理、gevent、芹菜、session,但我还是无法理解 尝试使用会话,但显然我无法从后台任务中访问请求对象。 我没有尝试gevent或芹菜,只是因为我

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

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

我读过很多不同的选项,比如多重处理、gevent、芹菜、session,但我还是无法理解

尝试使用会话,但显然我无法从后台任务中访问请求对象。 我没有尝试gevent或芹菜,只是因为我认为在不使用任何其他框架的情况下会有一个更简单的解决方案(我真的不想安装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_进程的请求进程共享,因此test_管理器获取并清空字典

不知道从这里到哪里去

有什么帮助吗


Cheers

要使用多处理接口在子进程和父进程之间共享数据,您可以使用中建议的方法之一,例如队列或管道

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

  • 在views.py中创建一个全局队列对象,如下所示
    global\u q=queue()
  • 创建用于初始化流程的视图,并将全局
    队列
    传递给流程函数:
def初始化过程(请求): p=进程(target=进程,args=(全局进程) p、 daemon=True p、 开始() 返回HttpResponse(json.dumps('Ok'),content_type=“application/json”)
  • 创建将从全局队列读取的其他视图:
def读取过程状态(请求): data=global_q.get() 返回HttpResponse(json.dumps(数据),content_type=“application/json”)
  • 需要时,process函数将处理设备并在队列参数中写入事件:
定义_过程(本地_q): #做一些事情 本地_q.put([6]) #做一些其他的事情 本地_q.put([34])
要使以上内容正常工作,您必须检查队列是否为空或使其不阻塞等,但您会明白的。

非常感谢Serafeim!这正是我需要做的!我想我忽略了一个事实,我本可以在views.py中定义一个变量,并且它由视图共享(我对python和django:D非常陌生)。再次感谢你的帮助!没问题,很高兴我能帮忙! 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") def read_process_status(request): data = global_q.get() return HttpResponse(json.dumps(data), content_type="application/json") def the_process(local_q): # do some things local_q.put([6]) # do some other things local_q.put([34])