2017-08-26 6 views
0

Ich möchte einen Dekorator erstellen, der Funktion in einem eigenen Thread laufen lassen kann. Und ich möchte auch eine Warteschlange als Argor des Dekorators verwenden, so dass ich den Rückgabewert der Funktion erhalten kann. So:Python Dekorateur mit Multithreading

import queue 
result = queue.Queue 
@thread(result) 
def function(args): 
    print ("Hello World!") 
    return args 
function("Hello Everyone!") 
print (result.get()) 

Vorgefasste, wird der Code diese Ausgabe erhalten:

Hello World!

Hello Everyone!

So schreibe ich Code wie folgt:

def thread(resultQueue = None): 
    def wrapper(function): 
     def process(*args, **kwargs): 
      ret = function(*args, **kwargs) 
      if resultQueue : resultQueue.put(ret) 
      return resultQueue 
     thread = threading.Thread(target = process) 
     thread.setDaemon(True) 
     thread.start() 
     return process 
    return wrapper 
a = queue.Queue() 

@basic.thread(a) 
def test(arg): 
    print (arg) 
    time.sleep(3) 
    return arg[::-1] 
test("Hello World!") 
print ("Hello!") 
print (a.get()) 

Aber ich habe diesen Fehler:

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "C:\Python34\lib\threading.py", line 911, in _bootstrap_inner 
    self.run() 
    File "C:\Python34\lib\threading.py", line 859, in run 
    self._target(*self._args, **self._kwargs) 
    File "test.py", line 214, in process 
    ret = function(*args, **kwargs) 
TypeError: test() missing 1 required positional argument: 'arg' 

Warum? Ich habe diese Ausnahme und wie kann ich das beheben?

Vielen Dank!

+1

https://stackoverflow.com/questions/14234547/threads-with-decorators Wenn Sie eine Erklärung benötigen, lassen Sie es mich wissen. – snahor

Antwort

1

Sie erstellen neue Thread in der wrapper Funktion. Stattdessen müssen Sie eine neue Methode darin definieren, die Thread erstellt.

def thread(resultQueue=None): 
    def wrapper(function): 
     def pw(*args, **kwargs): 
      def process(*args, **kwargs): 
       # print(args, kwargs) 
       ret = function(*args, **kwargs) 
       if resultQueue: 
        resultQueue.put(ret) 
       # return resultQueue 
      thread = threading.Thread(target=process, args=args, kwargs=kwargs) 
      thread.setDaemon(True) 
      thread.start() 
      return process 
     return pw 
    return wrapper 

Und Sie müssen auch Argumente an das Thema Konstruktor übergeben. Dies ist der Grund, warum Sie den Fehler erhalten.