在Django中连续运行后台任务

时间:2019-07-11 06:18:26

标签: python django

我正在Django中运行服务器,该服务器连续获取值。该函数在其中使用了foreverloop,当我调用该函数时,它永远不会退出循环。 我的问题-我想从服务器连续获取值,并在我想要的任何地方使用后缀。

我尝试了线程化,我认为我可以做的是做一个后台任务,该任务不断地为数据库提供数据,当我想使用它时,我可以从中获取值。但我不知道该怎么做

    ip = "192.168.1.15"

    port = 5005

    def eeg_handler(unused_addr, args, ch1, ch2, ch3, ch4, ch5):

        a.append(ch1)

        print(a)

    from pythonosc import osc_server, dispatcher

    dispatcher = dispatcher.Dispatcher()

    dispatcher.map("/muse/eeg", eeg_handler, "EEG")

    server = osc_server.ThreadingOSCUDPServer(
        (ip, port), dispatcher)

    # print("Serving on {}".format(server.server_address))

    server.serve_forever()

2 个答案:

答案 0 :(得分:0)

您可以创建一个Management command

使用管理命令,您可以通过通过Django访问数据库的方式来访问数据库。

然后,您可以从cron安排此命令,也可以使其永久运行,因为它不会阻塞您的应用程序。

另一个guide来写管理命令。

答案 1 :(得分:0)

您可以使用django-background-tasks,这是django的数据库支持的工作队列。您可以按照here中的说明进行安装。

针对您的案例的示例后台任务为:

<simpleError in get_soils_raster(product, attribute, component, depth, aoi, skip_val = TRUE): http error 400.>

您需要的是从常规代码中调用from background_task import background @background(schedule=60) def feed_database(some_parameter): # feed your database here # you can also pass a parameter to this function pass 来激活后台任务,这将创建一个Task对象并将其存储在数据库中,并在60秒后运行此功能。

在您的情况下,您想无限运行此函数,因此您可以执行以下操作:

feed_database

这将在60秒内无限次地运行您的函数。

它们还提供了django管理命令,您可以在其中使用feed_database(some_parameter, repeat=60, repeat_until=None) 向任务提供运行命令(如果您不想从代码中启动任务)。