Python如何使用未知数量的参数初始化线程?

时间:2012-07-09 21:27:42

标签: python multithreading iterable-unpacking

在尝试创建线程时,我无法将星号表达式与固定参数列表结合使用。

请考虑以下代码:

the_queue = Queue()

def do_something(arg1, arg2, queue):
    # Do some stuff...
    result = arg1 + arg2

    queue.put(result)

def init_thread(*arguments):
    t = Thread(target=do_something, args=(arguments, the_queue))
    t.start()
    t.join()

init_thread(3,6)

抛出异常:

TypeError: do_something() takes exactly 3 arguments (2 given)

换句话说,“arguments”元组被评估为一个元组对象(即它没有被解包),而the_queue被认为是第二个参数。

代码需要能够使用未知数量的参数初始化调用不同方法的线程,但最后总是会有一个“queue”参数。

有没有办法实现这个目标?在那种情况下,怎么样?如果没有 - 我做错了什么?

感谢。

编辑:我应该补充说,调用“init_thread()”方法并将队列作为参数不是一个选项,因为我不希望我的其余代码“知道”线程处理程序的工作原理内部...

2 个答案:

答案 0 :(得分:1)

您需要制作新的tuple

t = Thread(target = do_something, args = arguments + (the_queue, ))

答案 1 :(得分:1)

您也可以解压缩打包的*参数元组,如下所示:

>>> def Print(*args):
...     print('I am prepended to every message!', *args)
... 
>>> Print('This', 'has', 'four', 'arguments')
I am prepended to every message! This has four arguments
>>> def Print(*args):
...     print('I am prepended to every message!', args)
... 
>>> Print('This', 'has', 'four', 'arguments')
I am prepended to every message! ('This', 'has', 'four', 'arguments')

所以你看,参考* agruments,而不是参数,将解包元组。 因此,您的代码可能是:

def init_thread(*arguments):  
    t = Thread(target=do_something, args=(*arguments, the_queue))
    t.start()
    t.join()