Python如何初始化具有未知数量参数的线程?

问题描述:

我在尝试创建线程时使用带有固定参数列表的加星形表达式时遇到了问题。Python如何初始化具有未知数量参数的线程?

考虑下面的代码:

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) 

换言之,该“参数”的元组被评估为一个元组对象(即它不是解包),并且the_queue被视为第二个参数。

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

有什么办法可以达到这个目的吗?在那种情况下,如何?如果不是 - 我做错了什么?

谢谢。

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

您需要新建一个tuple

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

啊,非常感谢。我不知道你可以将元组连接到另一个元组。干杯! – 2012-07-09 21:45:07

你也可以解压缩打包式*参数元组,像这样:

>>> 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() 
+0

我实际上首先尝试以这种方式写入(使用*参数解压缩),但尝试执行时遇到错误。我已经在python 2.6和python 3.2.2中试过了。哪种版本的Python是合法的?这当然是一个有用的功能,我认为是面临我的问题时丢失... 编辑:错误是“可以使用星号表达只作为分配目标” – 2012-07-10 20:40:49

+0

我不知道。我使用Python 3.2。一个快速谷歌在这里发现了一些类似的问题。 http://*.com/questions/3870778/why-does-this-cause-a-syntax-error http://*.com/questions/10967819/python-when-can-i-unpack-a-generator我猜这只是不幸的,还有一套额外的parens。其中一个链接提出了与第一个答案相同的解决方案。 – Dubslow 2012-07-10 21:41:04