[英]Python how to initialize thread with unknown number of arguments?
在尝试创建线程时,我无法将已加星标的表达式与固定参数列表结合使用。
请考虑以下代码:
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()”方法不是一个选项,因为我不希望我的其余代码“了解”线程处理程序如何在内部工作。 。
你需要创建一个新的tuple
。
t = Thread(target = do_something, args = arguments + (the_queue, ))
您也可以解压缩打包的*参数元组,如下所示:
>>> 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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.