有序字典未在 python 内更新

Ordered Dictionary is not updating in python

views.py

from collections import OrderedDict

request_dict = OrderedDict()
def payment(request):
    request_dict[0] = 1
    request_dict[1] = 2

tasks.py

from Payment.celery import app
from celery.task.schedules import crontab
from celery.decorators import periodic_task
from datetime import datetime, timedelta
from . import views

@periodic_task(run_every=timedelta(seconds=2))
def addQueueTask():
    print('queue_task: ', views.request_dict)

我的问题是变量 OrderedDict 没有更新它们在 tasks.py 中的值并且它保持为空。这段代码中缺少的是我这边。 实际上 def payment 是一个从邮递员调用的网络 api 并在从邮递员调用时将两个值分配给 OrderedDict。

编辑:周期性任务的输出如下:

[2017-06-09 11:16:41,012: INFO/Beat] Scheduler: Sending due task PaymentConnectionGatewayApp.tasks.addQueueTask (PaymentConnectionGatewayApp.tasks.addQueueTask)

[2017-06-09 11:16:41,016: INFO/MainProcess] Received task: PaymentConnectionGatewayApp.tasks.addQueueTask[bf6d8440-3fad-48ed-88b9-175434913ff8]

[2017-06-09 11:16:41,017: WARNING/Worker-2] queue_task:

[2017-06-09 11:16:41,017: WARNING/Worker-2] /home/saurabh/Documents/PaymentConnectionGatewayProject/PaymentConnectionGatewayApp/views.py

[2017-06-09 11:16:41,018: WARNING/Worker-2] queue_task:

[2017-06-09 11:16:41,018: WARNING/Worker-2] OrderedDict()

[2017-06-09 11:16:41,018: INFO/MainProcess] Task PaymentConnectionGatewayApp.tasks.addQueueTask[bf6d8440-3fad-48ed-88b9-175434913ff8] succeeded in 0.0014399110004887916s: None

第一点:在您的代码段中,views.payment() 从未执行过,因此很明显它不会更新 views.request_dict

这就是说:celery 任务和网络服务器代码(我假设是 Django 或 Flask 之类的东西?)将 运行 在不同的进程中,因此每个进程都有自己的 views.request_dict 副本,因此您在一个进程中对 views.request_dict 所做的任何操作都只会在这个确切的进程中可用。 FWIW 根据您部署代码的方式(服务器和芹菜),您很可能会有许多服务器进程和许多芹菜进程,并且 每个 这些进程将拥有自己的 views.request_dict.

长话短说:不要使用可变全局变量在进程之间共享数据。如果您想在进程之间共享状态,请使用一些专用工具,例如数据库(关系数据库、文档数据库、redis,只要它能处理来自不同进程的并发访问)。

(实际上和 FWIW,无论在什么情况下都避免使用可变全局变量,从长远来看,这将使您的生活更轻松 运行)。