Chr*_*ris 17 python multithreading
我有以下代码,这是基于我在这里找到的一个例子,但是当我运行它时,我得到一个错误.请帮忙,我确定它非常简单:
def listener(port):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('',port))
sock.settimeout(1) # n second(s) timeout
try:
while True:
data, addr = sock.recvfrom(1024)
print data
except socket.timeout:
print 'Finished'
def startListenerThread(port):
threading.Thread(target=listener, args=(port)).start()
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
self.run()
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 477, in run
self.__target(*self.__args, **self.__kwargs)
TypeError: listener() argument after * must be a sequence, not int
Run Code Online (Sandbox Code Playgroud)
And*_*ark 49
错误来自以下行:
threading.Thread(target=listener, args=(port)).start()
Run Code Online (Sandbox Code Playgroud)
该args参数必须是一个序列,我觉得你的意图是使用一个元组,但在括号包装单个值不做到这一点.以下是您需要将其更改为:
threading.Thread(target=listener, args=(port,)).start()
Run Code Online (Sandbox Code Playgroud)
这是一个显示差异的简单示例:
>>> (100) # this is just value 100
100
>>> (100,) # this is a tuple containing the value 100
(100,)
Run Code Online (Sandbox Code Playgroud)
该args参数threading.Thread需要是一个元组
threading.Thread(target=listener, args=(port)).start()
Run Code Online (Sandbox Code Playgroud)
请注意,不是那些产生单元素元组的parens,它是逗号:
>>> type((1))
<type 'int'>
>>> type((1,))
<type 'tuple'>
Run Code Online (Sandbox Code Playgroud)
改变上面的
threading.Thread(target=listener, args=(port,)).start()
Run Code Online (Sandbox Code Playgroud)