Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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
Python Django中内存数据结构的异步任务队列处理_Python_Django_Asynchronous_Singleton_Celery - Fatal编程技术网

Python Django中内存数据结构的异步任务队列处理

Python Django中内存数据结构的异步任务队列处理,python,django,asynchronous,singleton,celery,Python,Django,Asynchronous,Singleton,Celery,我在Django项目中有一个单例内存数据结构(某种kd树,需要在整个项目中访问) 对于那些不了解Django的人,我相信常规Python代码也会出现同样的问题 我知道它是邪恶的(单例),我正在寻找更好的方法来实现它,但我这里的问题与另一个主题有关: 我通过调用 Singleton.instance()并且它正确地给了我对象,然后它会停留在我的/manage.py运行服务器中的某个内存位置 问题是,我在同一个单例数据结构上使用芹菜进行一些异步处理(例如重建kd树) 但是,当启动一个芹菜工作者时,它

我在Django项目中有一个单例内存数据结构(某种kd树,需要在整个项目中访问)

对于那些不了解Django的人,我相信常规Python代码也会出现同样的问题

我知道它是邪恶的(单例),我正在寻找更好的方法来实现它,但我这里的问题与另一个主题有关:

我通过调用
Singleton.instance()
并且它正确地给了我对象,然后它会停留在我的
/manage.py运行服务器中的某个内存位置

问题是,我在同一个单例数据结构上使用芹菜进行一些异步处理(例如重建kd树)

但是,当启动一个芹菜工作者时,它在一个不同的进程中运行代码,因此有一个不同的内存空间,这意味着它在一个完全不同的单例实例上工作

对于这个问题,最好的设计模式是什么?我曾想过在Django项目中完成与我的数据结构相关的所有处理(不使用芹菜),但我非常喜欢芹菜,因为数据结构上所需的处理可能需要很长时间(大约30秒),并且需要很好地处理并发性(可能同时有多个请求来重建Kd树)

我很高兴能对此有一些见解,因为在过去的3天里我没有取得任何进展。
非常感谢。

您的问题听起来像是一个典型的进程间通信问题,而不是一个单一的问题。正确的答案在很大程度上取决于您如何在芹菜任务中获取状态。默认情况下,您可以尝试通过参数传递或使用缓存或存储机制在两个进程之间共享状态。也许我如果你能提供更多关于你想要共享的州以及你需要它的方式的信息,那么你就有可能给出更好的建议。数据结构非常大(可能达到2GB),因此我不想处理Redis、memcached或其他额外的层……难道没有办法共享“对象”吗在Python到芹菜中?但您特别希望处理在单独的进程中完成,这就是芹菜的要点;进程不共享内存。这不是Python的限制,而是关于进程的一般要点。另外请注意,当您从devserver移动到适当的pr时,您会遇到完全相同的跨进程通信问题Production server,它几乎肯定会使用多个进程-每个进程都有自己的单例副本。现在我了解了在不同进程上执行此操作的局限性。解决此问题的最佳方法是什么?共享状态的最佳方法是什么?我是否应该查看IPC(如python的多线程库)或者更深入到Redis、Memcached等方面?我看到这些选项的问题是,我需要在每次请求时序列化/取消序列化内存中的数据结构。还有Daniel,在生产服务器上如何处理这些IPC问题?非常感谢