Threading Decorator [Python]

Oct 27 2020

Ich versuche, ein einfaches Programm mit Python-Socket und Threading-Bibliothek zu erstellen. Ich möchte das folgende Verfahren mit einem Dekorateur automatisieren:

t = threading.Thread(target=function, args=(arg1, arg2))
t.start()

Das Programm ist mit OOP strukturiert, daher habe ich in der Hauptklasse eine Unterklasse definiert, die alle Dekoratoren enthält (ich habe in diesem Artikel über diese Methode gelesen: https://medium.com/@vadimpushtaev/decorator-inside-python-class-1e74d23107f6). Deshalb habe ich eine Situation wie diese:

class Server(object):

    class Decorators(object):

        @classmethod
        def threaded_decorator(cls, function):
            def inner_function():
                function_thread = threading.Thread(target=function)
                function_thread.start()
            return inner_function

    def __init__(self, other_arguments):
        # other code
        pass

    @Decorators.threaded_decorator
    def function_to_be_threaded(self):
        # other code
        pass

Aber wenn ich versuche zu laufen, erhalte ich den folgenden Fehler : TypeError: function_to_be_threaded() missing one required argument: 'self'. Ich vermute, dass das Problem in dem Teil liegt, in dem ich das Threading aufrufe. Thread (Ziel = Funktion), der irgendwie nicht die gesamte Funktion self.function_to_be_threaded übergibt. Wenn Sie wissen, wie Sie das beheben können, können Sie es mir bitte sagen. Können Sie mir auch sagen, ob es eine Möglichkeit gibt, einen Dekorateur zu implementieren, der Argumente akzeptiert, die an die Thread-Klasse als übergeben werden args=(arguments_of_the_decorator)?

Vielen Dank für Ihre Zeit und entschuldigen Sie mein Englisch, ich übe es immer noch

Antworten

1 napuzba Oct 27 2020 at 15:15

Verwenden Sie die *argsSyntax, um die Argumente zu verschieben. Mit anderen Worten, verwenden Sie *argsdiese Option, um alle Positionsargumente als Tupel zu sammeln und threading.Threadals zu verschieben args.

import threading
import time
class Server(object):

    class Decorators(object):

        @classmethod
        def threaded_decorator(cls, function):
            def inner_function(*args):
                function_thread = threading.Thread(target=function,args=args)
                function_thread.start()
            return inner_function

    def __init__(self, count,sleep):
        self.count = count
        self.sleep = sleep

    @Decorators.threaded_decorator
    def function_to_be_threaded(self,id):
        for xx in range(self.count):
            time.sleep(self.sleep)
            print("{} ==> {}".format(id,xx))
           

>>> Server(6,1).function_to_be_threaded('a')
>>> Server(2,3).function_to_be_threaded('b')

a ==> 0
a ==> 1
a ==> 2
b ==> 0
a ==> 3
a ==> 4
a ==> 5
b ==> 1

Siehe auch Wie kann ich Argumente von einer Funktion an eine andere übergeben?