为啥threading.thread将空字典传递给python中的函数线程
Posted
技术标签:
【中文标题】为啥threading.thread将空字典传递给python中的函数线程【英文标题】:why threading.thread pass empty dictionary to function thread in python为什么threading.thread将空字典传递给python中的函数线程 【发布时间】: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);你的缩进比你想象的更烦人 【参考方案1】:好的,我不会使用你的代码,只是给你一个例子,我相信你会自己处理:
>>> from threading import Thread
>>> def f(**kwargs):
print(kwargs)
>>> Thread(target=f, kwargs='1':1, '2':2).start()
'2': 2, '1': 1
【讨论】:
以上是关于为啥threading.thread将空字典传递给python中的函数线程的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 WebClient 将空正文传递给 POST 端点