0

私はこのコードを持っています

class MyTh(threading.Thread):

    def __init__(self, group=None, target=None, name=None,
                 args=(), kwargs=None, verbose=None):
        threading.Thread.__init__(self, group=group, target=target, name=name,
                                  verbose=verbose)
        self.args = args
        self.kwargs = kwargs
        return

    def run(self):
        logging.debug('running with %s and %s', self.args, self.kwargs)
        return

def my_func(): 
   print 'Everything OK'

私がこれをするとき

t1 = MyTh(name='Thread '+ str(i), target=myfunc, args=("test",), kwargs={'a':'A', 'b':'B'})
    t1.start()

ターゲット関数がまったく呼び出されません。ターゲットで指定されたデフォルトの関数をスレッドに呼び出させるにはどうすればよいですか?

4

1 に答える 1

1

メソッドをオーバーライドするrun()ことで、標準を台無しにしrun()、ターゲットを呼び出さないようにします。必要なのは、メソッドをオーバーライドしないか、次のようにオーバーライドすることです。

def run(self):
    logging.debug('running with %s and %s', self.args, self.kwargs)
    super(MyTh, self).run()
    return

このようにして、標準Thread.runも呼び出され、target実行されます。

また、コンストラクターに渡さargsれていません。あなたが持っている必要があります:kwargsThread

threading.Thread.__init__(self, group=group, target=target, name=name,
                              verbose=verbose, args=args, kwargs=kwargs)

それらが適切に設定されるために。次に、次のように変更できますmy_func

def my_func(arg1, a, b):
    print arg1, a, b
    print 'Everything OK'

また、MyThのコンストラクタとの呼び出しThread.__init__は不要です。これははるかに短くて読みやすいです:

def __init__(self, *args, **kwargs):
    threading.Thread.__init__(self, *args, **kwargs)
    self.args = kwargs['args']
    self.kwargs = kwargs['kwargs']

コンストラクターに渡すとが実際にどのようにアクセス可能であるargsかに注意してください。kwargskwargs['args']kwargs['kwargs']

于 2013-03-01T08:55:13.727 に答える