gpt4 book ai didi

python - 使用 Pyramid 事件和多线程

转载 作者:行者123 更新时间:2023-12-03 13:15:57 25 4
gpt4 key购买 nike

我想将事件订阅/通知与多线程一起使用。听起来它应该只在理论上起作用,并且文档中不包含任何警告。这些事件应该是同步的,因此也不要延迟。

但是实际上,当我通知主线程时,什么都没有进来:

def run():
logging.config.fileConfig(sys.argv[1])
with bootstrap(sys.argv[1]) as env:
get_current_registry().notify(FooEvent()) # <- works
Thread(target=thread).start() # <- doesn't work

def thread():
get_current_registry().notify(FooEvent())

难道这行不通吗?还是我做错了什么?

我也尝试了建议的解决方案。它不会打印预期的事件。

class Foo:
pass

@subscriber(Foo)
def metric_report(event):
print(event)

def run():
with bootstrap(sys.argv[1]) as env:

def foo(env):
try:
with env:
get_current_registry().notify(Foo())
except Exception as e:
print(e)

t = Thread(target=foo, args=(env,))
t.start()
t.join()

最佳答案

get_current_registry()在处理请求或配置时试图访问线程局部变量Pyramid寄存器,以告诉线程当前使用哪种Pyramid应用程序处于 Activity 状态。这里的问题是get_current_registry()总是返回一个注册表,而不是您想要的一个注册表,因此很难知道为什么它不起作用。

产生新线程时,需要将Pyramid应用注册为当前线程本地。最好的方法是使用pyramid.scripting.prepare。 “简单”的方法就是在您的线程中再次运行 bootstrap 。我将展示“正确”的方式。

def run():
pyramid.paster.setup_logging(sys.argv[1])
get_current_registry().notify(FooEvent()) # doesn't work, just like in the thread
with pyramid.paster.bootstrap(sys.argv[1]) as env:
registry = env['registry']
registry.notify(FooEvent()) # works
get_current_registry().notify(FooEvent()) # works
Thread(target=thread_main, args=(env['registry'],)).start()

def thread_main(registry):
registry.notify(FooEvent()) # works, but threadlocals are not setup if other code triggered by this invokes get_current_request() or get_current_registry()

# so let's setup threadlocals
with pyramid.scripting.prepare(registry=registry) as env:
registry.notify(FooEvent()) # works
get_current_registry().notify(FooEvent()) # works
pyramid.scripting.prepare是 bootstrap 在后台使用的功能,它比多次运行 bootstrap 要有效得多,因为它共享注册表和所有应用程序配置,而不是制作应用程序的全新副本。

关于python - 使用 Pyramid 事件和多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61471535/

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