我需要注入线程级上下文信息以进行日志记录和调试。有人告诉我这可能是不安全的。
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的了解而言,我看不出这是不安全的,为什么其他人说这可能是灾难的根源呢?
尽管我将其视为一个非常丑陋的猴子补丁,但我并未创建全局可变状态。我正在创建一个线程局部常量,该常量在线程甚至运行之前就已实例化。
我同意,“安全/不安全”适用于痴迷的父母。作为程序员,我们可以以更加严格和有用的方式定义对故障的期望。
spawn
。现在,sleep()
在新生成的greenthread执行之前,需要采取其他方法才能屈服于“事件循环”,但是这种行为将来可能会改变。这意味着run_worker
可能已经在运行。您可以eventlet.pools.Pool()
用来管理绿色线程的正确设置和链接,然后再运行它们。__slots__
节省内存或__setattr__
出于其他原因而实现特定的实现。threading
[1]的修补版本。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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句