İş Parçacığı Dekoratörü [Python]

Oct 27 2020

python soket ve threading kitaplığı kullanarak basit bir program oluşturmaya çalışıyorum. Bir dekoratör kullanarak aşağıdaki prosedürü otomatikleştirmek istiyorum:

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

program OOP kullanılarak yapılandırıldı, bu yüzden ana sınıfın içinde tüm dekoratörleri içerecek bir alt sınıf tanımladım (bu yöntemi bu makalede okudum: https://medium.com/@vadimpushtaev/decorator-inside-python-class-1e74d23107f6). Bu nedenle şöyle bir durum var:

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

Ben çalıştırmayı denediğinizde Fakat, aşağıdaki hatayı alıyorum: TypeError: function_to_be_threaded() missing one required argument: 'self'. Bir şekilde self.function_to_be_threaded işlevinin tamamını geçmeyen threading.Thread (target = function) işlevini çağırdığımda sorunun kısımda yer aldığından şüpheleniyorum. Dolayısıyla, bunu nasıl düzelteceğinizi biliyorsanız, lütfen bana söyler misiniz? Ayrıca, Thread sınıfına olarak iletilecek argümanı kabul eden bir dekoratör gerçekleştirmenin bir yolu olup olmadığını bana söyleyebilir misiniz args=(arguments_of_the_decorator)?

Zaman ayırdığınız için çok teşekkür ederim ve ingilizcemi bağışlayın, hala alıştırma yapıyorum

Yanıtlar

1 napuzba Oct 27 2020 at 15:15

Kullanım *argssözdizimi arguments.In diğer kelimeler, kullanım taşımak için *argsbir başlığın gibi tüm pozisyonel argümanları toplamak ve taşımak için threading.Threadolduğu gibi 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

ayrıca bkz . Bir işlevden diğerine nasıl bağımsız değişken aktarabilirim?