【发布时间】:2015-09-03 17:28:13
【问题描述】:
我很想订阅 UPnP 设备(WeMo 运动传感器)上的事件。我首先向设备发送 HTTP 订阅请求,设备应该开始在指定地址上向我发送事件通知。那部分工作正常(除了我收到太多通知;即使状态没有改变,但对于不同的线程来说这是一个不同的问题)
如果我在单独的 python 进程上运行 keepListening 函数,一切正常。但是,当我将函数作为线程运行时,它不起作用;
import socket
import requests
from threading import Thread
def keepListening(): #running this function on a separate process works
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.settimeout(600)
sock.bind(('192.168.10.231',1234))
sock.listen(5)
while 1:
notification = ''
try:
conn, addr = sock.accept()
conn.setblocking(1)
notification= conn.recv(1024)
conn.sendall(r'''HTTP/1.1 200 OK
Content-Type: text/plain
''')
except Exception as er:
print er
print notification
x = Thread(target=keepListening)
x.start()
message = {
'CALLBACK': '<http://192.168.10.231:1234>',
'NT': 'upnp:event',
'TIMEOUT': 'Second-600',
'HOST': '192.168.10.159:49153'}
k = requests.request('SUBSCRIBE','http://192.168.10.159:49153/upnp/event/basicevent1',headers=message)
print k
# keep doing other important works
每个事件通知都必须回复一个 200 OK 回复,否则设备不会再发送通知;一个事实,我学会了艰难的方式。我有一个可能很愚蠢的疑问是,当在线程中运行时,与单独的进程相反,回复消息不会及时发送,因此设备不会再发送任何通知。 值得一提的是,即使我在线程中运行该函数,我确实收到订阅后的初始通知(设备必须根据 UPnP 协议强制在订阅后立即发送初始通知),但我没有收到进一步的通知(表明我的 200 OK 回复没有正确通过;不过我确实在 Wireshark 中看到了)
您知道在线程(而不是单独的进程)中运行函数可能会导致失败的区别吗?
谢谢。
【问题讨论】:
标签: python multithreading sockets upnp