Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在cherrypy托管的django中启动和维护后台线程?_Django_Multithreading - Fatal编程技术网

如何在cherrypy托管的django中启动和维护后台线程?

如何在cherrypy托管的django中启动和维护后台线程?,django,multithreading,Django,Multithreading,我有一个Django项目,它提供了一个API。api提供了必须随时间测量的信息。例如,每隔2秒测量一次,持续2秒。我想写一个后台线程来测量信息并将其写入一个可以立即访问的地方。 我在cherrypy上招待django 我有以下要求: 我需要访问线程中的Django ORM。所以Django必须已经安装好了 软要求:我不想在每次测量后将信息写入DB。我更愿意将其写入可以从views.py访问的变量 如果我用CTRL C停止cherrypy,它必须停止,而不是阻塞,因为我的线程正在运行 我的线程不

我有一个Django项目,它提供了一个API。api提供了必须随时间测量的信息。例如,每隔2秒测量一次,持续2秒。我想写一个后台线程来测量信息并将其写入一个可以立即访问的地方。 我在cherrypy上招待django

我有以下要求:

  • 我需要访问线程中的Django ORM。所以Django必须已经安装好了
  • 软要求:我不想在每次测量后将信息写入DB。我更愿意将其写入可以从views.py访问的变量
  • 如果我用CTRL C停止cherrypy,它必须停止,而不是阻塞,因为我的线程正在运行
  • 我的线程不能阻止migrate和makemigration终止
以下是我当前的尝试,它仅满足前两个要求(CPU测量只是一个示例):

有人知道解决办法吗

def thread_function(name):
    global cpu_usage
    while True:
        cpu_usage = psutil.cpu_percent(interval=2)
        time.sleep(2)
        #print("measuing CPU " + str(cpu_usage))

        if cherrypy.engine.state == cherrypy.engine.states.EXITING:
            break


x = threading.Thread(target=thread_function, args=(1,))
x.start()
因此,经过几个小时的进一步研究,我找到了一个解决方案。 你可以从任何地方进口cherrypy,它就像一个Singleton。你得到的总是同一个物体。所以你可以随时检查你的cherrypy现在在做什么。因此,如果它正在退出,则退出线程。 在没有cherrypy的情况下,您仍然可以在调试模式下运行django。在这种情况下,Cherrypy将停止,因此线程将运行

还有一个问题是,如果有人访问第一个端点,如何启动它: 进入apps.py并从views.py导入内容。例如导入x。 Python现在将扫描views.py并在向下的过程中启动线程

def thread_function(name):
    global cpu_usage
    while True:
        cpu_usage = psutil.cpu_percent(interval=2)
        time.sleep(2)
        #print("measuing CPU " + str(cpu_usage))

        if cherrypy.engine.state == cherrypy.engine.states.EXITING:
            break


x = threading.Thread(target=thread_function, args=(1,))
x.start()