有序字典未在 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,无论在什么情况下都避免使用可变全局变量,从长远来看,这将使您的生活更轻松 运行)。
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,无论在什么情况下都避免使用可变全局变量,从长远来看,这将使您的生活更轻松 运行)。