make Communication thread safe
parent
bcd9d00a47
commit
a9e31d01f9
16
util.py
16
util.py
|
@ -1,4 +1,4 @@
|
|||
import sys, traceback
|
||||
import sys, traceback, threading
|
||||
|
||||
EXIT_SUCCESS=0
|
||||
EXIT_ERROR=1
|
||||
|
@ -30,10 +30,12 @@ def error(message, is_exception=True, handle_gracefully=True):
|
|||
#TODO: make thread safe
|
||||
class Communication:
|
||||
def __init__(self):
|
||||
self.lock = threading.Lock()
|
||||
self.__messages = {}
|
||||
|
||||
# send a message tagged with name and containing content, adds to the beginning of the list of messages with the same tag by default, a function to run as an additional action can be provided
|
||||
def send(self, name, content, reverse_order=True, additional_action=None):
|
||||
self.lock.acquire()
|
||||
if name in self.__messages:
|
||||
if reverse_order:
|
||||
self.__messages[name] = [content] + self.__messages[name]
|
||||
|
@ -45,32 +47,44 @@ class Communication:
|
|||
pass
|
||||
else:
|
||||
additional_action()
|
||||
self.lock.release()
|
||||
|
||||
# get the content of the first message tagged with name, removes the returned message by default
|
||||
def get(self, name, remove=True):
|
||||
self.lock.acquire()
|
||||
if name in self.__messages and len(self.__messages[name])>0:
|
||||
if remove:
|
||||
content = self.__messages[name].pop(0)
|
||||
if len(self.__messages[name])==0:
|
||||
del self.__messages[name]
|
||||
self.lock.release()
|
||||
return content
|
||||
else:
|
||||
self.lock.release()
|
||||
return self.__messages[name][0]
|
||||
else:
|
||||
self.lock.release()
|
||||
return None
|
||||
|
||||
# get the contents for all messages tagged with name
|
||||
def get_all(self, name, clear=False):
|
||||
self.lock.acquire()
|
||||
if name in self.__messages and len(self.__messages[name])>0:
|
||||
contents = self.__messages[name]
|
||||
if clear:
|
||||
del self.__messages[name]
|
||||
self.lock.release()
|
||||
return contents
|
||||
else:
|
||||
self.lock.release()
|
||||
return None
|
||||
|
||||
# deletes all messages tagged with name
|
||||
def clear(self, name):
|
||||
self.lock.acquire()
|
||||
if name in self.__messages:
|
||||
del self.__messages[name]
|
||||
self.lock.release()
|
||||
|
||||
def __del__(self):
|
||||
if len(self.__messages)>0:
|
||||
|
|
Reference in New Issue