0

私はPython2.7+でうまく動作する次のコードを持っていました

class Worker(threading.Thread):
    def __init__(self, group=None, target=None, name=None,
                 args=(), kwargs=None, verbose=None, onCompleteCb=None):
        self.__onCompleteCb = onCompleteCb
        self.__name = name
        super(Worker, self).__init__(group, target, name, args, kwargs, verbose)

    def getName(self):
        return self.__name

    def run(self):
        try:
            super(Worker, self).run()
            if self.__onCompleteCb is not None: self.__onCompleteCb(self.__name)
        except Exception, e:
            if self.__onCompleteCb is not None: self.__onCompleteCb(self.__name, failed=True, exception=e)

しかし、最近、私のコードは2.4以降のバージョンをサポートする必要があることがわかりました。上記のコードでは、runが呼び出されますが、呼び出すとsuper(Worker, self).run()、次のエラーが表示されます。

 TypeError: threadTargMethod() argument after ** must be a dictionary

superPython 2.4では別の方法で呼び出す必要がありますか?

解決策 次の方法でスレッドを開始する必要があります。

Worker(target=threadTargMethod, name="thread1", args=(), kwargs={}).start()

v2.7では、次の方法で開始しましたが、機能します

Worker(target=threadTargMethod, name="thread1").start()
4

2 に答える 2

1

コードを次のように変更することをお勧めします。

class Worker(threading.Thread):
    def __init__(self, group=None, target=None, name=None,
             args=(), kwargs={}, verbose=None, onCompleteCb=None):
        ...
        super(Worker, self).__init__(group=group, target=target, name=name, 
                                     args=args, kwargs=kwargs)

言い換えると:

  • 空の辞書のデフォルトを作成しますkwargs(ドキュメントと一致します-2.7で幸運だったようです)

  • パラメータを含めないでverboseください (2.4 または 2.7 ではサポートされていません - そこで何が起こっていたのかわかりません)

  • 名前を明示的にする

その変更により、引き続き開始できます

Worker(target=threadTargMethod, name="thread1").start()

kwargsデフォルトで正しく設定されるためです。

于 2013-02-25T23:02:00.060 に答える
0

v2.4 では、次の方法でスレッドを開始する必要があります。

Worker(target=threadTargMethod, name="thread1", args=(), kwargs={}).start()

v2.7では、次の方法で開始していましたが、動作します

Worker(target=threadTargMethod, name="thread1").start()
于 2013-02-25T22:47:55.753 に答える