Django是否信号线程安全?

unk*_*tee 5 django signals

如果我将断开然后在单线程上下文中连接一些信号会影响其他线程使用的信号池吗?

更新
我会尝试更具体.

我正在为少数发件人使用post_save和pre_delete信号,这些发件人触发特定模型(一个特定模型)的全文引擎重建索引,这是全文引擎的主要内容源.

重新索引是通过Celery任务完成的,信号处理程序只需将重建索引任务分配给代理(在我的案例中是Redis).

一些post_save信号不应该触发重建索引(即 - 不应该调度Celery任务,pre_delete应该总是触发重建索引),因为一些模型更改与全文引擎内容无关(即状态更改,时间戳更改和其他一些).我无法在每个案例中验证处理程序kwargs中的update_fields,因为根据我的观察,管理站点保存操作没有指定那些.

我正在使用自定义上下文管理器,它将重新索引处理程序与特定发件人的post_save信号断开连接,将控制权返回到调用代码段,然后执行模型上的保存操作,并在控件传递回上下文管理器时,所有重建索引处理程序都在重新连接到特定发件人的post_save信号.

我想确保在单线程上下文中执行的上下文管理器中的断开/连接例程不会影响其他线程(即 - 在单线程上下文中断开的所有信号仍将在其他线程中连接).

谢谢!unkletee

kja*_*jaw 2

如果您的代码如下所示:

@contextmanager
def disable_signal():
   try:
      post_save.disconnect(your_signal)
      yield None
   finally: 
      post_save.connect(your_signal)
Run Code Online (Sandbox Code Playgroud)

这不是线程安全的,因为我们正在更改全局变量。 https://docs.python.org/3/library/contextlib.html#reentrant-context-managers

另请注意,可重入与线程安全不同。例如,redirect_stdout() 绝对不是线程安全的,因为它通过将 sys.stdout 绑定到不同的流来对系统状态进行全局修改。