【问题标题】:How to destroy resource in a django+fastcgi+IIS setup?如何在 django+fastcgi+IIS 设置中销毁资源?
【发布时间】:2020-10-31 11:02:40
【问题描述】:

我有一个有趣的问题。我正在使用 IIS+FastCgi+Django 设置来提供查询服务。最初,我希望并发执行,但有一个组件 X 不允许其多次调用,因为并行调用时其许可证检查代码明显失败。为了确保只有 1 个 django 实例运行,我计划执行以下操作:

  1. IIS:据我检查,它与并发没有任何直接关系。我可能错了。
  2. IIS 中的 FastCGI 模块:

最大实例:1(我认为这意味着 fastcgi 只会加载 1 内存中的 django 应用程序代码库。)

实例最大请求:200(这将确保在我上面 内存中 django 应用程序的代码库按顺序处理 200 个请求,它会破坏 自己并重新启动。)为什么这种回收是必要的?

队列长度:1000(这将创建传入请求的积压 即使它们来自多个来源,它也会确保 他们不会立即被拒绝)

  1. Django:现在这个组件 X 需要大约 1-2 秒来加载自己,所以我不能把它的加载代码放在 POST 视图函数中。我打算把它放在 app.py 中的一个类中,该类从 django.apps 的 AppConfig 扩展,就像人们加载机器学习模型一样。这样,当 FASTCGI worker 将 django 应用程序代码库加载到内存中时,它只会被加载一次。

问题是200次请求后,fast cgi什么时候回收或者销毁?加载的 django 代码库,我也需要销毁组件 X 实例。但是,我对这方面不太了解。

这个组件X(它是一个windows应用程序)的加载方式是:

X = library.sdk("name") // 这基本上打开了一个连接 应用程序的 com 对象。

要销毁这个组件,官方文档说要这样做:

X.close()

这个 X.close() 代码在 django 中的什么地方?另外,如果我的想法有误,请随时纠正我。

编辑:添加赏金

【问题讨论】:

标签: python django iis fastcgi


【解决方案1】:

允许并发

您可以使用锁定机制来允许对资源的唯一访问并允许对站点的其余部分进行并发访问:

import threading
lock = threading.Lock()

def foo():
    with lock:
        bar()

在这里你可以找到一些关于python线程同步的文档: Thread Synchronization Mechanisms in Python

关闭组件

Daniel Butler 在 cmets 中指出的那样关闭组件,您可以使用类和单例:

a = ClassA()

class ClassA():
    self.x_instance = None

    def __init__(self):
       self.x_instances = library.sdk("name")

    def __del__(self):
        self.x_instances.Close()

【讨论】:

  • 感谢您的建议,我会试试这个并在这里更新。
  • del 按预期工作。谢谢丹尼尔和戴维德。对于并发部分,我想知道这是否可以应用于我的场景,因为 IIS 模块的 Fast CGI 正在处理并发访问。
猜你喜欢
  • 2020-12-27
  • 2014-09-05
  • 1970-01-01
  • 2021-06-01
  • 2022-07-13
  • 1970-01-01
  • 2020-03-27
  • 2019-11-14
  • 2017-12-18
相关资源
最近更新 更多