【问题标题】:Python : how to pass argument to thread job (callback)Python:如何将参数传递给线程作业(回调)
【发布时间】:2018-08-09 18:03:39
【问题描述】:

我正在 Python 中实现带有回调的线程。我有问题不知道如何将参数传递给线程作业。

我做了什么:

import time
import threading


class BaseThread(threading.Thread):
    def __init__(self, callback=None, callback_args=None, *args, **kwargs):
        target = kwargs.pop('target')
        super(BaseThread, self).__init__(target=self.target_with_callback, *args, **kwargs)
        self.callback = callback
        self.method = target
        self.callback_args = callback_args

    def target_with_callback(self):
        self.method()
        if self.callback is not None:
            self.callback(*self.callback_args)


def my_thread_job(param1, param2):
    # do any things here
    print "{} {}".format(param1, param2)
    print "thread start successfully and sleep for 5 seconds"
    time.sleep(5)
    print "thread ended successfully!"


def cb(param1, param2):
    # this is run after your thread end
    print "callback function called"
    print "{} {}".format(param1, param2)


# example using BaseThread with callback
thread = BaseThread(
    name='test',
    target=my_thread_job,
    args=("test","callback"),
    callback=cb,
    callback_args=("hello", "world")
)

thread.start()

我有错误

Traceback(最近一次调用最后一次):文件 “/usr/lib64/python2.7/threading.py”,第 804 行,在 __bootstrap_inner self.run() 文件“/usr/lib64/python2.7/threading.py”,第 757 行,运行中 self.__target(*self.__args, **self.__kwargs) TypeError: target_with_callback() 只需要 1 个参数(给定 5 个)

欢迎提出任何建议。

【问题讨论】:

    标签: multithreading python-2.7 callback


    【解决方案1】:

    Original GitHub Code
    这将允许您将初始参数传递到线程中。

    import time
    import threading
    
    
    class BaseThread(threading.Thread):
        def __init__(self, callback=None, callback_args=None, *args, **kwargs):
            target = kwargs.pop('target')
            target_args = kwargs.pop('target_args')
            super(BaseThread, self).__init__(target=self.target_with_callback, *args, **kwargs)
            self.callback = callback
            self.method = target
            self.method_args = target_args
            self.callback_args = callback_args
    
        def target_with_callback(self):
            self.method(*self.method_args)
            if self.callback is not None:
                self.callback(*self.callback_args)
    
    
    def my_thread_job(param1, param2):
        # do any things here
        print "{} {}".format(param1, param2)
        print "thread start successfully and sleep for 5 seconds"
        time.sleep(5)
        print "thread ended successfully!"
    
    
    def cb(param1, param2):
        # this is run after your thread end
        print "callback function called"
        print "{} {}".format(param1, param2)
    
    
    # example using BaseThread with callback
    thread = BaseThread(
        name='test',
        target=my_thread_job,
        target_args=("threadJobArg1","threadJobArg2"),
        callback=cb,
        callback_args=("hello", "world")
    )
    
    thread.start()
    

    【讨论】:

    • 谢谢 Daniel Gale,是的,我尝试为线程做回调,我也想在线程作业中有参数。只是我不知道如何正确定义 BaseThread 以将参数传递给线程作业。如果你有任何想法,请分享给我
    猜你喜欢
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2015-05-06
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 2010-11-14
    相关资源
    最近更新 更多