将上下文注入这样的eventlet线程是否安全?

用户名

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

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的了解而言,我看不出这是不安全的,为什么其他人说这可能是灾难的根源呢?


尽管我将其视为一个非常丑陋的猴子补丁,但我并未创建全局可变状态。我正在创建一个线程局部常量,该常量在线程甚至运行之前就已实例化。

手本

我同意,“安全/不安全”适用于痴迷的父母。作为程序员,我们可以以更加严格和有用的方式定义对故障的期望。

  • 该方法现在可以使用,因此,当eventlet和greenlet版本被锁定时,它将起作用,并且一切都很好。
  • 您将在之后更改Greenthread属性spawn现在,sleep()在新生成的greenthread执行之前,需要采取其他方法才能屈服于“事件循环”,但是这种行为将来可能会改变。这意味着run_worker可能已经在运行。您可以eventlet.pools.Pool()用来管理绿色线程的正确设置和链接,然后再运行它们。
  • 将来可能会中断,因为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/

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将上下文(CDI / Servlet)注入新的FutureTask线程

来自分类Dev

Django - 将上下文注入 base.html

来自分类Dev

我是否安全地注入上下文?Dagger,Android Studio 警告

来自分类Dev

在匿名线程的上下文中访问局部变量是否安全?

来自分类Dev

在匿名线程的上下文中访问局部变量是否安全?

来自分类Dev

将上下文注入到类似于Jersey InjectableProvider的Spring MVC控制器中

来自分类Dev

Glassfish 4.0.1上的Jersey 2.4:如何将上下文HttpServletRequest注入ContainerRequestFilter?

来自分类Dev

多线程上下文中的assert()安全

来自分类Dev

Specflow上下文注入

来自分类Dev

在Akka Scheduler中关闭actor上下文是否安全?

来自分类Dev

什么是线程上下文?

来自分类Dev

将上下文变量添加到现有上下文

来自分类Dev

从一个上下文到另一个上下文使用NSManagedObjectID是否安全?

来自分类Dev

发出将上下文属性传递给ServerResource的问题

来自分类Dev

将上下文传递给接口方法

来自分类Dev

将上下文与Redux一起使用

来自分类Dev

将上下文菜单添加到.exe文件

来自分类Dev

将上下文对象传递给异步操作

来自分类Dev

将上下文从JUnit Runner传递到黄瓜步骤

来自分类Dev

将上下文项的属性传递给 fn:id()

来自分类Dev

如何将上下文发送到 BroadcastReceiver?

来自分类Dev

如何从测试中注入上下文

来自分类Dev

上下文注入和BeforeFeature挂钩

来自分类Dev

IWebDriver的Specflow上下文注入失败

来自分类Dev

上下文未正确注入

来自分类Dev

上下文注入和BeforeFeature挂钩

来自分类Dev

IWebDriver的Specflow上下文注入失败

来自分类Dev

是否可以将上下文传递到使用ReactDOM.render实例化的组件中?

来自分类Dev

是否可以将上下文传递到使用ReactDOM.render实例化的组件中?

Related 相关文章

  1. 1

    将上下文(CDI / Servlet)注入新的FutureTask线程

  2. 2

    Django - 将上下文注入 base.html

  3. 3

    我是否安全地注入上下文?Dagger,Android Studio 警告

  4. 4

    在匿名线程的上下文中访问局部变量是否安全?

  5. 5

    在匿名线程的上下文中访问局部变量是否安全?

  6. 6

    将上下文注入到类似于Jersey InjectableProvider的Spring MVC控制器中

  7. 7

    Glassfish 4.0.1上的Jersey 2.4:如何将上下文HttpServletRequest注入ContainerRequestFilter?

  8. 8

    多线程上下文中的assert()安全

  9. 9

    Specflow上下文注入

  10. 10

    在Akka Scheduler中关闭actor上下文是否安全?

  11. 11

    什么是线程上下文?

  12. 12

    将上下文变量添加到现有上下文

  13. 13

    从一个上下文到另一个上下文使用NSManagedObjectID是否安全?

  14. 14

    发出将上下文属性传递给ServerResource的问题

  15. 15

    将上下文传递给接口方法

  16. 16

    将上下文与Redux一起使用

  17. 17

    将上下文菜单添加到.exe文件

  18. 18

    将上下文对象传递给异步操作

  19. 19

    将上下文从JUnit Runner传递到黄瓜步骤

  20. 20

    将上下文项的属性传递给 fn:id()

  21. 21

    如何将上下文发送到 BroadcastReceiver?

  22. 22

    如何从测试中注入上下文

  23. 23

    上下文注入和BeforeFeature挂钩

  24. 24

    IWebDriver的Specflow上下文注入失败

  25. 25

    上下文未正确注入

  26. 26

    上下文注入和BeforeFeature挂钩

  27. 27

    IWebDriver的Specflow上下文注入失败

  28. 28

    是否可以将上下文传递到使用ReactDOM.render实例化的组件中?

  29. 29

    是否可以将上下文传递到使用ReactDOM.render实例化的组件中?

热门标签

归档