【发布时间】:2014-04-05 14:07:45
【问题描述】:
我想在创建开始时将字典发送到线程。与我的问题相关的部分代码如下(此代码尝试将 websocket 映射到另一个无 web-socket):
class SimpleEcho(WebSocket):
def SockFun(self,**FlagDict):
try:
print "6"
ms=mysocket()
print "7"
ms.connect("127.0.0.1",7778)
print "8"
while (1):
print FlagDict
print "9"
FlagDict["sockexists"]=1
print "90"
#data=FlagDict["Data"]
msg=str(self.data)
self.data=''
print "91"
#FlagDict["Data"]=''
print "92"
#msg=str(self.data)
print msg
print "93"
#print self.FlagDict
ms.mysend(msg)
print "10"
a=ms.myreceive()
print "11"
self.sendMessage(a)
print "12"
FlagDict["sockexists"]=0
print "13"
FlagDict["threadexists"]=0
ms.myclose()
print "14"
except Exception as a:
FlagDict["sockexists"]=0
FlagDict["threadexists"]=0
ms.myclose()
print "error in SockFun",a
def handleMessage(self):
print "2"
if self.data is None:
print "3"
self.data = ''
else:
self.FlagDict["Data"]=self.data
self.CheckThread()
print "20"
class WebSocket(threading.Thread):
def __init__(self, server, sock, address):
self.server = server
self.client = sock
self.address = address
self.handshaked = False
self.headerbuffer = ''
self.readdraftkey = False
self.draftkey = ''
self.headertoread = 2048
self.hixie76 = False
self.fin = 0
self.data = None
self.opcode = 0
self.hasmask = 0
self.maskarray = None
self.length = 0
self.lengtharray = None
self.index = 0
self.request = None
self.usingssl = False
self.state = self.HEADERB1
# restrict the size of header and payload for security reasons
self.maxheader = 65536
self.maxpayload = 4194304
self.FlagDict={}
self.FlagDict["sockexists"]=0
self.FlagDict["threadexists"]=0
def CheckThread(self):
self.FlagDict["Data"]=self.data
print self.FlagDict
try:
print "4"
if self.FlagDict["threadexists"]==0:
print "5"
self.FlagDict["threadexists"]=1
print "15"
ts=threading.Thread(target=self.SockFun(),args=self.FlagDict)
# ts=threading.Thread(target=self.SockFun())
print "16"
ts.deamon=True
print "17"
ts.start
print "18"
print "19"
except Exception as d:
print "error in handleMessage",d
print "202"
运行时的代码输出如下:
('127.0.0.1', 51180) 已连接 1 2 {'Data': bytearray(b'Page-1;'), 'sockexists': 0, 'threadexists': 0} 4 5 15 6 7 8 {} 9 90 91 92 第 1 页; 93 10 11 12 {'sockexists': 1} 9 90 91 92
93 10 11 12 {'sockexists': 1} 9 90 91 92
93 10 11 12 {'sockexists': 1} 9 90 91 92
93 10 11 12 {'sockexists': 1} 9 90 91 92
93 10 11 12 {'sockexists': 1} 9 90 91 92
93 10
如您所见,threading.thread 将空字典传递给 SockFun 函数。为什么会发生这种情况,我该如何解决? 有关 WebSocket 模块的更多信息,您可以看到: https://github.com/opiate/SimpleWebSocketServer http://opiate.github.io/SimpleWebSocketServer/
【问题讨论】:
-
args 是对 dict 的引用,但您“拦截”了一个 dict。尝试使用 SockFun(self, dictRef)。当您传递对它的引用时,您的 dict 不会作为 **dict 传递,因为它是一个 dict
-
P.S.:SockFun(self, FlagDict);你的缩进比你想象的更烦人
标签: python multithreading websocket