为啥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中的函数线程的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给threading.Thread

尝试使用 WebClient 将空正文传递给 POST 端点

将空列表作为参数传递给 JPA 查询会引发错误

如何将空参数传递给 msdeploy powershell deploy 命令

使用 @Query JPA 注释将空参数传递给本机查询

将空值作为参数传递给方法时如何修复 NullPointerException [重复]