-4

视图.py

from collections import OrderedDict

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

任务.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 是一个从邮递员调用的 web api,并在从邮递员调用时为 OrderedDict 分配两个值。

编辑:定期任务的输出如下:

[2017-06-09 11:16:41,012:INFO/Beat] 调度程序:发送到期任务 PaymentConnectionGatewayApp.tasks.addQueueTask (PaymentConnectionGatewayApp.tasks.addQueueTask)

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

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

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

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

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

[2017-06-09 11:16:41,018:INFO/MainProcess] 任务 PaymentConnectionGatewayApp.tasks.addQueueTask[bf6d8440-3fad-48ed-88b9-175434913ff8] 在 0.0014399110004887916s 中成功:无
4

1 回答 1

1

第一点:在你的代码片段中,views.payment()永远不会执行,所以很明显它不会更新views.request_dict

话虽这么说:celery 任务和网络服务器代码(我假设像 Django 或 Flask 之类的东西?)将在不同的进程中运行,所以每个进程都有自己的副本views.request_dict,所以无论你views.request_dict在一个进程中做什么,都只能在这个确切的过程。FWIW 取决于您如何部署代码(服务器和 celery),您很可能会有许多服务器进程和许多 celery 进程,并且每个进程都有自己的views.request_dict.

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

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

于 2017-06-09T11:47:37.260 回答