2015-11-12 29 views
2

我有一個裝飾@newthread它包裝的功能在一個單獨的線程中運行(使用functoolswrapsThreadthreading)。但是,有些功能我只想在某些時候發生。如何切換一個裝飾的作用在Python3

目前,我有@newthread檢查函數的關鍵字參數被包裹,如果發現一個布爾new_thread等於True然後它運行在一個單獨的線程的功能,否則正常運行的功能。例如,

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

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

這是這樣做的規範方式,還是我錯過了什麼?

+2

@Kevin的代碼是什麼有需要評審? '@ newthread'實現沒有顯示,'foo'的東西都是假設的。 –

+0

或者你可以根據需要使用'thread_foo = newthread(foo)'並使用'foo'或'thread_foo',但我認爲你的方式更好。 –

+0

@ 200_success:是的,如果OP實際提供了一些代碼進行審查,這可能會有所幫助。 – Kevin

回答

2

然後,請不要使用newthread作爲裝飾器。裝飾器只是一個接受函數並返回函數的函數。

如果你希望它在當前線程中運行,調用

foo(some, params) 

如果你想在一個新的線程中運行foo,叫

newthread(foo)(some, params) 
1
@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