0

I would like to send a dictionary to a thread at the begining of its creation.part of my code that relates to my problem is as follow (this code tries to map a websocket to a another none 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"

code output at runtime is as follows:

('127.0.0.1', 51180) connected 1 2 {'Data': bytearray(b'Page-1;'), 'sockexists': 0, 'threadexists': 0} 4 5 15 6 7 8 {} 9 90 91 92 Page-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

as you can see threading.thread pass empty dictionary to SockFun function. why this is happened and how can I solve it? fore more info about WebSocket module you can see: https://github.com/opiate/SimpleWebSocketServer http://opiate.github.io/SimpleWebSocketServer/

2
  • the args are a reference to a dict but you 'intercept' a dict. Try with SockFun(self, dictRef).Your dict is not passed as **dict just because is a dict, when you pass reference to it Commented Apr 5, 2014 at 14:44
  • P.S.:SockFun(self, FlagDict); your indentation is more annoying than you think Commented Apr 5, 2014 at 15:01

1 Answer 1

1

OK, I won't use your code, just give you an example and I'm sure you'll handle it yourself:

>>> from threading import Thread
>>> def f(**kwargs):
        print(kwargs)

>>> Thread(target=f, kwargs={'1':1, '2':2}).start()
{'2': 2, '1': 1}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.