【问题标题】:How to toggle the action of a decorator in Python3如何在 Python3 中切换装饰器的操作
【发布时间】:2015-11-13 02:19:56
【问题描述】:

我有一个装饰器@newthread,它包装函数以在单独的线程中运行(使用来自functoolswraps 和来自threadingThread)。但是,有些功能我只希望在某些时候发生这种情况。

目前,我让@newthread 检查要包装的函数的关键字参数,如果它发现布尔值new_thread 等于True,那么它将在单独的线程中运行该函数,否则运行正常运作。例如,

@newthread
def foo(new_thread=False)
     # Do stuff...

foo() # Runs normally
foo(new_thread=True) # Runs in new thread

这是执行此操作的规范方式,还是我遗漏了什么?

【问题讨论】:

  • @Kevin 有什么代码需要审查? @newthread 实现没有显示,foo 的东西都是假设的。
  • 或者你可以做thread_foo = newthread(foo)并根据你的需要使用foothread_foo,但我认为你的方式更好。
  • @200_success:是的,如果 OP 确实提供了一些代码供审查,这可能会有所帮助。
  • @ArtOfWarfare 1. 作为 Code Review 的版主,我向您保证,由于上述原因,该问题将在 Code Review 时立即结束。 2. “因为它属于 Code Review”并不是将这个问题归类为 Stack Overflow 题外话的正当理由。请参阅help center 以获取有效的离题原因列表。另请阅读A guide to Code Review for Stack Overflow users
  • 条件装饰器呢?见Python3 decorating conditionally?

标签: python multithreading python-3.x decorator


【解决方案1】:

那么,不要使用newthread 作为装饰器。装饰器只是一个接受一个函数并返回一个函数的函数。

如果你想让它在当前线程中运行,调用

foo(some, params)

如果您想在新线程中运行foo,请调用

newthread(foo)(some, params)

【讨论】:

    【解决方案2】:
    @newthread
    def foo(new_thread=False)
         # Do stuff...
    
    foo() # Runs normally
    foo(new_thread=True) # Runs in new thread
    

    这很好 - 但是,我宁愿让装饰器使用“new_thread”参数,而不是让它显示在装饰函数的参数列表中。

    此外,您可以使用“默认”值,以便您选择使用其他地方的不同线程的实际需要(如环境变量):

    MARKER = object()
    def newthread(func):
        def wrapper(*args, newthread=MARKER, **kwargs):
            if newthread is MARKER:
                  newthread = os.environ.get("force_threads", True)
            if newthread:
                 ...
                 # cretae new thread and return future-like object
            else:
                 return func(*args, **kwargs)
        return wrapper
    

    【讨论】:

      猜你喜欢
      • 2013-01-16
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      相关资源
      最近更新 更多