我知道这个问题听起来很愚蠢,但我无法做对。
我想开始一个新线程来执行带有多个参数的函数。我不知道如何完成它。这里总是有错误。
thread = threading.Thread(target=urllib2.urlopen, args=((url=REMOTE_SERVER_URL, data=context),))
thread.start()
新线程将启动此功能。
urllib2.urlopen(url=REMOTE_SERVER_URL, data=context)
任何人都可以帮助我吗?怎么做对吗?感谢
答案 0 :(得分:4)
元组不接受关键字参数,它们不是函数。如果要传递关键字参数,请将字典作为kwargs
参数传递:
thread = threading.Thread(target=urllib2.urlopen, kwargs={
'url': REMOVE_SERVER_URL,
'data': context
})
或者:
thread = threading.Thread(
target=urllib2.urlopen,
kwargs=dict(url=REMOVE_SERVER_URL, data=context)
)
答案 1 :(得分:1)
@Blender已经在上面给出了解决方案。
但对此类线程constructor
进行了一些解释。
在线程模块中,Class Thread不使用任何* args和** kwargs,
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})
在上面的代码片段中,args只是一个默认值为空元组的参数,而kwargs是另一个默认值为空字典的参数。这不同于
类似def foo(*args, **kwargs)
的函数所以,如果你想传递元组参数,请使用args
,如果你想传递字典参数请kwargs。
所以,如果你创建一个如下所示的对象将运行没有任何错误,但这是错误的。
>>> thread = threading.Thread(target=urllib2.urlopen, args='some argument which is not tuple', kwargs='some argument which is not dict')
>>>
从源代码:请检查args和kwargs行,那里没有拆包。
def __init__(self, group=None, target=None, name=None,
args=(), kwargs=None, verbose=None):
assert group is None, "group argument must be None for now"
_Verbose.__init__(self, verbose)
if kwargs is None:
kwargs = {}
self.__target = target
self.__name = str(name or _newname())
self.__args = args
self.__kwargs = kwargs
self.__daemonic = self._set_daemon()
self.__ident = None
self.__started = Event()
self.__stopped = False
self.__block = Condition(Lock())
self.__initialized = True
# sys.stderr is not stored in the class like
# sys.exc_info since it can be changed between instances
self.__stderr = _sys.stderr
如果您不喜欢这个答案,请在评论中告诉我,我会将其删除。
感谢