gpt4 book ai didi

django - Django 信号线程安全吗?

转载 作者:行者123 更新时间:2023-12-04 11:33:19 26 4
gpt4 key购买 nike

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

更新
我会尽量说得更具体一些。

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

重新索引是通过 Celery 任务完成的,信号处理程序只是将重新索引任务分派(dispatch)给代理(在我的例子中是 Redis)。

一些 post_save 信号不应触发重新索引(即 - 不应调度 Celery 任务,pre_delete 应始终触发重新索引),因为某些模型更改与全文引擎内容无关(即状态更改、时间戳更改等)。我不太能够在每种情况下验证处理程序 kwargs 中的 update_fields,因为根据我的观察,管理站点保存操作没有指定这些。

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

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

谢谢!
无名小卒

最佳答案

如果您的代码如下所示:

@contextmanager
def disable_signal():
try:
post_save.disconnect(your_signal)
yield None
finally:
post_save.connect(your_signal)
这不是线程安全的,因为我们正在更改全局变量。
https://docs.python.org/3/library/contextlib.html#reentrant-context-managers

Note also that being reentrant is not the same thing as being thread safe. redirect_stdout(), for example, is definitely not thread safe, as it makes a global modification to the system state by binding sys.stdout to a different stream.

关于django - Django 信号线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20907631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com