gpt4 book ai didi

python - 像这样将上下文注入(inject) eventlet 线程安全吗?

转载 作者:行者123 更新时间:2023-11-28 18:28:48 24 4
gpt4 key购买 nike

我需要注入(inject)线程级上下文信息以进行日志记录和调试。有人告诉我这可能不安全。

greenthread = worker_pool.spawn(run_worker, args, handle_result)
# this logging_context attribute will be accessed by the logging library
greenthread.__dict__['logging_context'] = 'data for logging'
greenthread.link()

虽然肯定不是您经常想要做的事情,但这是我可以设置线程局部全局常量的唯一方法,记录器可以访问它。

稍后记录器可以通过

访问它
eventlet.getcurrent().logging_context

就我对 Python 的了解而言,我不明白这有何不安全之处,为什么其他人说这可能会导致灾难?


虽然我认为它是一个相当丑陋的猴子补丁,但我并不是在创建全局可变状态。我正在创建一个线程局部常量,该常量在线程运行之前实例化。

最佳答案

我同意,“安全/不安全”适用于痴迷的 parent 。作为程序员,我们可以以更严格和有用的方式定义对问题的预期。

  • 该方法现在有效,因此当 eventlet 和 greenlet 版本被锁定时,它会起作用并且一切都很好。
  • 您要在 spawn 之后更改 Greenthread 属性。现在它需要 sleep() 或其他方式在新生成的 greenthread 执行之前屈服于“事件循环”,但这种行为将来可能会改变。这意味着 run_worker 可能已经在运行。您可以使用 eventlet.pools.Pool() 来管理 greenthreads 的正确设置和链接,然后再允许它们运行。
  • 将来它可能会中断,因为 greenthread 会得到 __slots__ 来节省内存,或者出于其他原因得到特定的 __setattr__ 实现。
  • 有针对您正在执行的操作的经过测试和支持的 API,它称为线程本地存储。您可以像使用常规 Python threadlocal 对象一样使用它,但使用 threading[1] 的补丁版本。
  • 你可能更喜欢 Logbook[2],它有更简洁的方式来做同样的事情(在后台使用 threadlocal)。

threadlocal 路由的示例代码:

def add_logging_context(context, fun, *a, **kw):
tl = threading.local()
tl.logging_context = context
return fun(*a, **kw)

pool.spawn(add_logging_context, 'data for logging', run_worker, args, handle_result)

[1] http://eventlet.net/doc/patching.html

[2] https://logbook.readthedocs.io/en/stable/

关于python - 像这样将上下文注入(inject) eventlet 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39099325/

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